0

我有一个数据框,有两列

'V1'     'V2'
joe      hi, my names is *joe*
anne     i was talking to *jake* the other day...
steve    *anne* should have the answer
steve    *joe* and I will talk later

我想获取第 1 列中的名称列表并使用它在第 2 列中搜索它们。

(星号只是表明名称在长字符串中。)

我真正想说的是,对于第一列中的每个条目,如果您也可以在第二列中找到它,则打印该行。

我试过这个

for (i in dft[1]) if (i == dft[2]) print(i)

这个想法是计算它们出现在每列中的次数,并最终得到类似

V1    V2    V3
joe   1     2
anne  1     1
jake  0     1
steve 2     0

有任何想法吗?

4

2 回答 2

1

假设您要计算第一列的每个元素在每一列中出现的次数,您可以执行以下操作

dat <- data.frame(V1=c("joe", "ann", "steve", "steve"),
                  V2=c("hi, my name is *joe*", 
                       "i was talking to *jake* the other day...", 
                       "*anne* should have the answer",
                       "*joe* and I will talk later"), 
                  stringsAsFactors=FALSE)

t(sapply(dat$V1, function(x) cbind(length(grep(x, dat$V1)), length(grep(x, dat$V2)))))

#      [,1] [,2]
#joe      1    2
#ann      1    1
#steve    2    0
#steve    2    0

sapply将对 column 的每个元素应用一个函数V1。在这种情况下,该函数将计算该元素在列V1和列中出现的次数V2以及cbind它们一起出现的次数。 sapply将结果简化为矩阵。最后,t将矩阵转置为您要求的形式。

于 2012-06-11T15:29:12.850 回答
0

不幸grep的是,它的第一个参数没有向量化,所以你必须这样mapply做。

dat <- data.frame(V1=c("joe","anny"),V2=c("hi, my name is joe","blah anne"))
mapply( FUN=function(x,y) grepl(x,y), x=dat$V1, y=dat$V2 )

这为您提供了一个逻辑向量,您可以将其用于子集或求和以用于显示目的。

于 2012-06-11T14:02:59.727 回答