在组内使用ifelse子句重新编码

时间:2019-01-21 17:33:31

标签: r if-statement group-by dplyr

我正在尝试设置列(称为“组合”)以指示每个组(组)内所有者和标头的组合信息。每个组中只有一个所有者,并且“ Head”基本上是每个组中具有最小id值的第一行。 如果将ID标记为所有者,则此合并的列应标记为“ 1”,则无论“ Head”中的信息如何,每个组中的其余ID将为0。但是,对于ID中没有任何所有者的组(即组中所有者中的全0),则此列将采用标头列信息。我的数据看起来像这样,最后一列(合并的)是期望的结果。

sample <- data.frame(Group = c("46005589", "46005589","46005590","46005591", "46005591","46005592","46005592","46005592", "46005593", "46005594"), ID= c("189199", "2957073", "272448", "1872092", "10374996", "1153514", "2771118","10281300", "2610301", "3564526"), Owner = c(0, 1, 1, 0, 0, 0, 1, 0, 1, 1), Head = c(1, 0, 0, 1, 0, 1, 0, 0, 1, 1), combined = c(0, 1, 1, 1, 0, 0, 1, 0, 1, 1))

    > sample
      Group       ID Owner Head combined
1  46005589   189199     0    1        0
2  46005589  2957073     1    0        1
3  46005590   272448     1    0        1
4  46005591  1872092     0    1        1
5  46005591 10374996     0    0        0
6  46005592  1153514     0    1        0
7  46005592  2771118     1    0        1
8  46005592 10281300     0    0        0
9  46005593  2610301     1    1        1
10 46005594  3564526     1    1        1

我已经尝试了一些dplyr和ifelse子句,但它似乎并没有提供我想要的输出。我应该如何重新编码此列?谢谢。

2 个答案:

答案 0 :(得分:0)

我认为这不是最好的方法,但是您可能会目视检查全为0的ID。您可以使用rowSums进行操作,并使用%in%指定这些ID。这是一个可能的解决方案:

library(dplyr)
    df %>% 
  mutate_at(vars(ID,Group),funs(as.factor)) %>% 
  mutate(Combined=if_else(Owner==1,1,0),
         NewCombi=ifelse(ID== "1872092",Head,Combined))

这产生了:NewCombi是我们的目标。

#      Group       ID Owner Head Combined NewCombi
#1  46005589   189199     0    1        0        0
#2  46005589  2957073     1    0        1        1
#3  46005590   272448     1    0        1        1
#4  46005591  1872092     0    1        0        1
#5  46005591 10374996     0    0        0        0
#6  46005592  1153514     0    1        0        0
#7  46005592  2771118     1    0        1        1
#8  46005592 10281300     0    0        0        0
#9  46005593  2610301     1    1        1        1
#10 46005594  3564526     1    1        1        1

答案 1 :(得分:0)

可以在dplyr中的两个步骤中创建新的合并列:首先使用filter(all(Owner == 0)),方法是创建一个仅包含'Head'个ID信息的列,其中ID信息不包含任何'Owner',然后将此列合并回原始数据框,将此列中的1与'Owner'列中的1相加,即可得出合并的信息。

    library(dplyr)
    sample2 <- sample %>%
               group_by(Group) %>%
               filter(all(Owner == 0)) %>%
               mutate(Head_nullowner = ifelse(Head == 1, 1, 0))     #select all rows of IDs that do not have any owners

#merge Head_nullowner with the original dataframe by both Group and ID
sample <- merge(sample, sample2[c("Group", "ID", "Head_nullowner")], by.x = c("Group", "ID"), by.y = c("Group", "ID"), all.x = T)
sample$Head_nullowner[is.na(sample$Head_nullowner)] <- 0
sample$OwnerHead_combined = sample$Owner + sample$Head_nullowner




> sample
      Group       ID Owner Head combined Head_nullowner OwnerHead_combined
1  46005589   189199     0    1        0              0                  0
2  46005589  2957073     1    0        1              0                  1
3  46005590   272448     1    0        1              0                  1
4  46005591 10374996     0    0        0              0                  0
5  46005591  1872092     0    1        1              1                  1
6  46005592 10281300     0    0        0              0                  0
7  46005592  1153514     0    1        0              0                  0
8  46005592  2771118     1    0        1              0                  1
9  46005593  2610301     1    1        1              0                  1
10 46005594  3564526     1    1        1              0                  1