Как создать столбец на основе условий со строками - PullRequest
1 голос
/ 17 марта 2020

У меня следующая проблема:

Shared_ID<-c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
Individual_ID<-c(11,12,13,21,22,23,31,32,33,41,42,43,51,52,53)
Individual_Con<-c(1,2,3,1,1,1,2,2,2,3,3,3,3,2,1)

table<-tibble(Shared_ID,Individual_ID,Individual_Con)
table

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

Individual_Con==1 ~ 1
Individual_Con==2 ~ 2
Individual_Con==3 ~ 3
any combination of Individual_Con ~ 4 

Для меня это означает, что если все Individual_Con в Shared_ID равны xe равному 1, то Shared_Con будет 1 , а последний случай - если на Shared_ID есть хотя бы 2 разных Individual_Con, Shared_Con будет 4

Это результат моего желания:

# A tibble: 15 x 4
   Shared_ID Individual_ID Individual_Con Shared_Con
       <dbl>         <dbl>          <dbl>      <dbl>
 1         1            11              1          4
 2         1            12              2          4
 3         1            13              3          4
 4         2            21              1          1
 5         2            22              1          1
 6         2            23              1          1
 7         3            31              2          2
 8         3            32              2          2
 9         3            33              2          2
10         4            41              3          3
11         4            42              3          3
12         4            43              3          3
13         5            51              3          4
14         5            52              2          4
15         5            53              1          4

Как это легко сделать? Заранее благодарю за любую помощь!

1 Ответ

2 голосов
/ 17 марта 2020

Мы можем создать группу по Shared_ID, проверить, больше ли число отдельных элементов в Individual_Con больше 1, затем вернуть 4 или же вернуть Individual_Con

library(dplyr)
table %>%
     group_by(Shared_ID) %>%
     mutate(Shared_Con = if(n_distinct(Individual_Con) > 1) 4 else Individual_Con)
# A tibble: 15 x 4
# Groups:   Shared_ID [5]
#   Shared_ID Individual_ID Individual_Con Shared_Con
#       <dbl>         <dbl>          <dbl>      <dbl>
# 1         1            11              1          4
# 2         1            12              2          4
# 3         1            13              3          4
# 4         2            21              1          1
# 5         2            22              1          1
# 6         2            23              1          1
# 7         3            31              2          2
# 8         3            32              2          2
# 9         3            33              2          2
#10         4            41              3          3
#11         4            42              3          3
#12         4            43              3          3
#13         5            51              3          4
#14         5            52              2          4
#15         5            53              1          4
...