比较组数据帧的列是否相等

时间:2018-01-11 13:52:08

标签: r dataframe dplyr

我的目标是比较按ID分组的组中的字符串或数字。因此,如果例如var1都是" NORMAL"新列将显示TRUE或FALSE。我知道我可以summarise_all()但我需要它作为另一个项目的新专栏。此外,我希望这种比较也适用于数字。所有必须在选择列中完全相同。有些团体的成员超过2人。

df <- structure(list(ID = c("A1.1234567", "A1.12345"), 
                 var1 = c("NORMAL", "NORMAL"), 
                 var2 = c("NORMAL", "NORMAL"), 
                 var3 = c("NORMAL", "NORMAL"), 
                 var4 = c("NORMAL", "NORMAL"), 
                 var5 = c("NORMAL", "NORMAL"), 
                 var6 = c("NORMAL", "NORMAL"), 
                 var7 = c("25", "25"), 
                 var8 = c("6, 9)),

            .Names = c("ID", "var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8"), 
            class = "data.frame", row.names = c(NA, -2L))

我希望它看起来像

         ID   var1   var2   var3   var4   var5   var6 var7 var8 var7.true va8.true
A1.1234567 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL  25    6    TRUE   FALSE
A1.1234567 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL  25    9    TRUE   FALSE

我唯一的想法是改变它,但我似乎无法正确比较它们

1 个答案:

答案 0 :(得分:3)

您可以使用mutate_at(而不是mutate_all)以便不包含ID,因为我们没有对其进行分组,并定义要创建的新变量的名称这样它就不会覆盖现有的那些,即

df %>% 
 mutate_at(vars(-ID), funs(new = ifelse(all(. == 'NORMAL'), TRUE, FALSE)))

给出了

             ID   var1   var2   var3   var4   var5   var6     var7   var8 var1_new var2_new var3_new var4_new var5_new var6_new var7_new var8_new
1 A1.1234567_10 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL   NORMAL NORMAL     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE    FALSE     TRUE
2 A1.1234567_20 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL ABNORMAL NORMAL     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE    FALSE     TRUE

编辑根据您的评论,有几种方法可以在所有元素中获得相等。我选择了唯一值为1的长度(如果全部相同),即

mutate_at(df, vars(-ID), funs(new = length(unique(.)) == 1))

BONUS 现在您不需要使用ifelse,因为我们没有定义值