R语言 setdiff()在分组变量上

qoefvg9y  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(114)

我想将变量组与外部列表(向量“Valid_codes”)进行比较。
考虑下面的例子

ID<-c("Carl", "Carl","Carl","Peter","Peter","Peter")
Question<-c("need","need","need","dyadic","dyadic","dyadic")
Image<-c("image1","image1","image1","image2","image2","image2")
V1<-c("A1","A2","C0","A3","A3","A1")
df<-data.frame(ID,Question,Image,V1)
df
Valid_codes<-c("A1","A2","A3","A4")

我希望得到如下输出,其中V1已根据ID和Question分组,每个组与向量Valid_codes进行比较,并将差异写入新列(MissingCodes,即:组中未使用有效代码)。图像编号应仅从原始图像转移,因为各组之间的图像编号相同。
| 分组(ID,问题)|图像|MissingCodes (setdiff())|
| - -----|- -----|- -----|
| 乔尔_需要|图片1| A3、A4|
| 彼得并矢|图像2| A2、A4|
我是数据wangling的新手,已经在完整的数据集上使用了setdiff(),但是当我想在分组数据上使用它时遇到了麻烦。实际数据集包含app。四万行。

df%>%
group_by(ID,Question, across(Image))%>%
mutate(Missing_Codes=setdiff(Valid_codes,?))

非常感谢任何帮助!

wtlkbnrh

wtlkbnrh1#

这应该可以做到:

df |>
  summarize(present_codes = list(V1), .by = c(ID, Question, Image)) |>
  mutate(missing_codes = lapply(present_codes, setdiff, x = Valid_codes))
#      ID Question  Image present_codes missing_codes
# 1  Carl     need image1    A1, A2, C0        A3, A4
# 2 Peter   dyadic image2    A3, A3, A1        A2, A4

请注意,present_codesmissing_codeslist类列,而不是字符向量。(present_codesmissing_codes的每一行都是一个字符向量,而不是列是一个字符向量。)这应该有助于以后的灵活性,但如果你想转换它们,你可以添加,例如,... |> mutate(missing_codes = sapply(missing_codes, toString))
一个小提示-当你说 “图像没有。应该只是从原始的转移,因为它是统一的跨组”,你应该只是包括它在分组。当您将数据汇总到每组1行时,没有真实的的方法“带来一些沿着”-它要么是(a)分组的一部分,(b)它需要一个汇总函数将其折叠为一个值,或者(c)它将被删除。

相关问题