筛选具有匹配值的行

时间:2019-09-26 17:22:23

标签: r string data-manipulation

我有一个类似以下数据集的数据集。 随着时间的推移加入主题的人


df <- data.frame("group" = c("A", "A", "A+1","A+1", "A+1", "B","B+1","B+1"), 
                 "id" = c("id1", "id2", "id1", "id2", "id3", "id5","id5","id1"), 
                 "time" = c(1,1,3,3,3,2,5,5),
                 "Val" = c(10,10,10,10,10,12,12,12),
                  "groupid" = c("A", "A", "A","A", "A", "B","B","B"))

我的最终目标是添加所有按ID分组的值。

我的问题是,作为新的主题加入组,例如,当主题“ id3”在时间3加入时,组“ A”成为组“ A + 1”,我的所有观察值都重复了(“ A + 1”包括“ id1”和“ id2”。因此,我无法计算总和。

总而言之,我想根据“组ID”标识符删除重复的“ ID”。
最终的df应该看起来像这样


final <- data.frame("group" = c("A", "A", "A+1", "B","B+1"), 
                 "id" = c("id1", "id2", "id3", "id5","id1"), 
                 "time" = c(1,1,3,2,5),
                 "Val" = c(10,10,10,12,12),
                 "groupid" = c("A", "A", "A", "B","B"))

我非常感谢您的帮助


跟进问题

我也有相反的情况,即随着时间的流逝,一些受试者会离开小组。数据集看起来像这样:

df2 <- data.frame("group" = c("A", "A", "A","A_1", "A_1", "B","B","B_1"), 
                 "id" = c("id1", "id2", "id3", "id2", "id3", "id5","id1","id1"), 
                 "time" = c(1,1,1,3,3,2,2,5),
                 "Val" = c(10,10,10,10,10,12,12,12),
                 "groupid" = c("A", "A", "A","A", "A", "B","B","B"))

在这种情况下,一个主题“ id1”离开了“组A”,成为“ A_1”组,其中只有“ id2”和“ id3”是成员。同样,“ id5”离开仅以id1为成员的B组,成为“ B_1”。

我希望在最终数据集中拥有的是相反类型的组标识,应该看起来像这样

final2 <- data.frame("group" = c("A", "A", "A","A_1", "B","B","B_1"), 
                     "id" = c("id1", "id2", "id3", "id1", "id5","id1","id5"), 
                     "time" = c(1,1,1,3,2,2,5),
                     "Val" = c(10,10,10,10,12,12,12),
                     "groupid" = c("A", "A", "A","A", "B","B","B"))

在此,“ A_1”和“ B_1”分别仅表示离开组的主题“ id1”和“ id5”,而不表示其余的主题。

对此方法有何建议?

在此先感谢您的帮助

1 个答案:

答案 0 :(得分:2)

这里是一种选择。按“ id”分组后,删除“ group”的子字符串,从+开始,后跟一个或多个数字(\\d+),直到字符串的结尾($),应用{在子字符串上使用{1}},以在duplicated内创建逻辑向量,以删除重复的行

filter