我有一个聊天室的数据集,里面有发送消息的人,还有一个更大的数据集,里面有这些人和其他人,除了去聊天室。
我需要识别那些单独在聊天室(聊天室数据集)中的人(聊天室数据集)-i.e,聊天室里只有一个人留言的人,并将他们从更大的数据集中删除。
因此,从下面的数据集中,我需要识别Persons、J、和M,然后从更大的数据集中删除这些人(其中还包含Persons到Z和许多其他非聊天数据)。
data.table(Chatroom = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8), Person = c("A","A", "B","C","D","E","F","G","H","I","J","J","J","K","L","M", "M"), Message = c("Hi", "You there?", "Hello", "Hi", "Hey", "Howdy", "Hi", "Hey", "Greetings", "Hi", "Hi", "Hello?", "Anyone there?", "Hey", "Hi", "Hello?", "Helllooooooo?"))
Chatroom Person Message
1: 1 A Hi
2: 1 A You there?
3: 2 B Hello
4: 2 C Hi
5: 3 D Hey
6: 3 E Howdy
7: 4 F Hi
8: 4 G Hey
9: 5 H Greetings
10: 5 I Hi
11: 6 J Hi
12: 6 J Hello?
13: 6 J Anyone there?
14: 7 K Hey
15: 7 L Hi
16: 8 M Hello?
17: 8 M Helllooooooo?什么R函数能帮我做到这一点?
我知道如何手动创建列表,但不知道如何根据我前面提到的标准从现有数据创建列表。我使用了变体、胶水、排列和drop_na等函数,但我很难想象如何将这些函数组合在一起,以便使用聊天室子集可重复地过滤更大的数据集。
建议?
发布于 2022-08-12 20:01:46
您可以创建这样的小型datatable to_remove:
to_remove = df[,ct:=uniqueN(Person), Chatroom][ct==1, .(Person=unique(Person))]然后反连接到您的另一个data.table (比如df_big),如下所示:
df_big[!to_remove, on="Person"]我使用的是data.table,因为这就是您提供df的方式,但是如果您想要使用dplyr的方法,可以这样做:
anti_join(
df_big,
df %>% group_by(Chatroom) %>% distinct(Person) %>% filter(n()==1),
by = "Person"
)https://stackoverflow.com/questions/73339165
复制相似问题