Определите и сгруппируйте наблюдения - PullRequest
1 голос
/ 07 марта 2019

Как я могу определить и сгенерировать новую переменную, которая определяет, какие наблюдения принадлежат различным группам.Скажем, у меня есть следующий набор данных:

ID | country  |  side  
1  |  arg     |  1
1  |  usa     |  0
2  |  ita     |  1
2  |  usa     |  0
2  |  uk      |  1
3  |  aus     |  0
3  |  uk      |  1

, и я хочу создать новую переменную (sideUK), которая идентифицирует, была ли страна "uk" включена в идентификатор и сторону каждой страны.Так, например, это будет:

ID | country  |  side  | sideuk
1  |  arg     |  1     |  0
1  |  usa     |  0     |  0
2  |  ita     |  1     |  1
2  |  usa     |  0     |  0
2  |  uk      |  1     |  1
3  |  aus     |  0     |  0
3  |  uk      |  1     |  1

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Вы хотите сгруппировать по ID, а затем проверить 'uk' в переменной country

df %>%
    group_by(ID, side) %>%
    mutate(sideuk = as.integer('uk' %in% country))

# A tibble: 7 x 4
# Groups:   ID, side [6]
     ID country  side sideuk
  <dbl> <fct>   <dbl>  <int>
1     1 arg         1      0
2     1 usa         0      0
3     2 ita         1      1
4     2 usa         0      0
5     2 uk          1      1
6     3 aus         0      0
7     3 uk          1      1
2 голосов
/ 07 марта 2019

Я не совсем уверен, что вы ищете, но следующее воспроизводит ваш ожидаемый результат

library(dplyr)
df %>%
    group_by(ID) %>%
    mutate(sideuk = +("uk" %in% country & side == 1)) %>%
    ungroup()
## A tibble: 7 x 4
#     ID country  side sideuk
#  <int> <fct>   <int>  <int>
#1     1 arg         1      0
#2     1 usa         0      0
#3     2 ita         1      1
#4     2 usa         0      0
#5     2 uk          1      1
#6     3 aus         0      0
#7     3 uk          1      1

Пример данных

df <- read.table(text =
    "ID  country    side
1    arg       1
1    usa       0
2    ita       1
2    usa       0
2    uk        1
3    aus       0
3    uk        1", header = T)
0 голосов
/ 07 марта 2019

Я не уверен, что это то, что вы ищете. Это решение без внешних библиотек:

df$sideuk <- apply(df, 1, function(row) {
  return(
    as.integer(any(df[df$ID==row["ID"] & df$country=="uk" & row["side"] == 1, "side"]))
  )
})

Возвращает:

  ID country side sideuk
1  1     arg    1      0
2  1     usa    0      0
3  2     ita    1      1
4  2     usa    0      0
5  2      uk    1      1
6  3     aus    0      0
7  3      uk    1      1
8  4      mx    1      0
9  4      uk    0      0

Пример данных

df <- read.table(text =
                   "ID  country    side
                 1    arg       1
                 1    usa       0
                 2    ita       1
                 2    usa       0
                 2    uk        1
                 3    aus       0
                 3    uk        1
                 4    mx        1
                 4    uk        0", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...