Идентифицировать и группировать по наблюдениям

#r #dplyr

#r #dplyr

Вопрос:

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

 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), которая определяет, была ли страна «великобритания» задействована в идентификаторе и стороне каждой страны. Так, например, это было бы:

 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
  

Ответ №1:

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

 library(dplyr)
df %>%
    group_by(ID) %>%
    mutate(sideuk =  ("uk" %in% country amp; 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)
  

Ответ №2:

Вы хотите сгруппировать по идентификатору, а затем проверить наличие '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
  

Ответ №3:

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

 df$sideuk <- apply(df, 1, function(row) {
  return(
    as.integer(any(df[df$ID==row["ID"] amp; df$country=="uk" amp; 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)