【发布时间】:2019-07-26 23:59:57
【问题描述】:
正如标题所暗示的,我的目标是在至少具有两个匹配元素的单独数据框中的两个因素(用逗号分隔的值)之间进行部分匹配
我有两个这样的数据框:
df1
structure(list(ID = c(55, 153, 274, 380, 34, 156), value = c("30002, 10057, 10012, 30045, 10065, 10207, 10013, 20056, 20024, 13026, 10032, 10031",
"10026, 10051, 10010, 10302", "10004, 10133, 10103", "10009, 10035",
"10003, 10202, 10319, 10421, 10025, 10033, 10045, 10036, 10049, 10055, 10062, 10069, 10083, 10086, 10089, 10090, 10099, 10100, 10102, 10103, 10112, 10114, 10120, 10125, 10126, 10128, 10144, 10148, 10149, 10150, 10158, 10159, 11330, 10035, 13508, 12003, 10124, 100266, 11302, 15305, 10240, 25024, 23003, 25204, 25343, 23058, 22007, 25278, 25204, 30117, 25346, 22324, 25325, 25133, 25229",
"11002, 11107, 13340, 10344")), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -6L))
df2
```r
structure(list(ID = c(75, 412, 289, 214, 48, 222), value = c("30002, 10041, 10031, 20024, 13026",
"10026, 10040", "10004, 10133", "10023, 10025, 10314, 10143",
"10001, 10125, 10126, 10128",
"10012, 10020, 10344")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))
如上图:1)ID不按顺序排列,我按“值”列排序,2)每行的元素数量可以不同,3)“列表”中的元素可以乱序4)原始数据框很大,所以我认为可能有多个匹配,所以我想输出匹配计数
***请注意,这里我按“值”对数据集进行排序,因此看起来它们是逐行匹配的,但实际上并非如此,如果您查看整个数据集,目标实际上是查找匹配项按项目。
如果任何两个列表至少有两个共同元素,我希望结果 df 返回数据框的 ID 和匹配元素:例如 df1 中的 ID 55 和 df1 中的 ID 75- 会返回类似
ID_1 ID_2 Matched_element Match_count
75 55 30002,20024,13026 3
我尝试使用字符串拆分来使变量值“列表”,但这仍然对我的部分匹配没有帮助。
df1<-str_split(df1$value, ",")
df2<-str_split(df2$value, ",")
Number of Matches Between Two Comma Separated Factors in a Data Frame 这个问题与我要问的问题非常相似,但无法解决我的问题,因为它是逐行匹配的。
【问题讨论】:
-
请使用
dput输出数据帧 -
“如上图:1)ID被完全打乱了” 不知道你说的打乱是什么意思。我也不清楚
"..."在您的第二个数据集中表示什么。你真的有只包含一组点的行吗?我支持前一个评论者的请求,即使用dput以可重复且明确的方式发布最少的数据。如果不确定,请查看如何提供minimal reproducible example/attempt。 -
嗨@djangodjango,欢迎来到 Stack!正如其他人所提到的,如果您可以
dput(df1)并将其发布在您的问题中(使用“编辑”选项),这将极大地帮助其他人尝试回答您的问题。尝试重新创建您的第一个,我会从ID <- c(1,2,3)、Value <- c("27003, 47013, 17010, 17129, 75339, 17140", "10325, 10049, 10002, 10009, 10010", "19007, 19000")、df1 <- data.frame(ID, Value)这样的东西开始,但是您的数据框是否有因素等? -
如果你有一个大数据框并且只想发布一定数量的行,你也可以使用
head()。因此,要提供数据框的前 3 行,您将使用dput(head(df1,3)) -
@RussThomas 它没有因素。我已经编辑了部分,感谢您的建议!