多列之间的公共条目

时间:2018-12-23 18:36:21

标签: r data.table

我有一个数据表

library(data.table)
df = data.table("a" = c('aa (1)', 'bb (2)', 'cc (3)'), 
                "b" = c('aa (2)', 'bb (2)', 'dd (3)'), 
                "c" = c('dd (3)', 'aa (1)', 'ff (3)'))
       a      b      c
1: aa (1) aa (2) dd (3)
2: bb (2) bb (2) aa (1)
3: cc (3) dd (3) ff (3)

我想在“ a”列和其他列之间找到通用元素,而仅找到字符而不是数字 这样的结果是

aa and bb are common in a and b column 
aa is common between column a and c.

我该怎么做。

我尝试使用相交,但是不知道我如何有效地去除数字。

1 个答案:

答案 0 :(得分:1)

首先删除每个元素末尾的垃圾,然后将每列与a相交。这样,第二列V2将作为向量列表,第三列V3将作为字符串:

df[, lapply(.SD, sub, pattern = "[ (].*", replacement = "")][, 
  .(names(df)[-1], sapply(.SD, intersect, a)), .SDcols = -1][,
  .(V1, V2, V3 = sapply(V2, toString))]

给予:

   V1    V2     V3
1:  b aa,bb aa, bb
2:  c    aa     aa

或者如果您喜欢长格式,则使用以下内容,除了最后一行外,其他内容与上述相同:

df[, lapply(.SD, sub, pattern = "[ (].*", replacement = "")][, 
       .(names(df)[-1], sapply(.SD, intersect, a)), .SDcols = -1][,
       lapply(.SD, unlist), by = V1]

给予:

   V1 V2
1:  b aa
2:  b bb
3:  c aa