包含另一个文件中的字符串的data.frame的子集行

时间:2015-11-17 14:40:15

标签: r string grep match subset

我想对包含数据帧2(df2)中的列的字符串的数据帧1(df1)的行进行子集化。问题是file1将在同一列中有多个字符串。我尝试过子集和grep的几种变体,但没有成功。 这是一个文件的例子,以及我想要实现的结果(或者没问题):

df1

A Jan  
B Feb  
C Mar  
D Apr  
E May  
F Jun  
G Jul  
H Aug  
I Sept  
J Oct 

df2

1 apple A,C,D,F  
2 pear A,D  
3 plum B,F  
5 orange B,C,D,H 

结果1

1 apple A,C,D,F Jan,Mar,Apr,Jun  
2 pear A,D Jan,Apr  
3 plum B,F Feb,Jun  
5 orange B,C,D,H Feb,Mar,Apr,Aug  

结果2

$imagick = new Imagick(); 
$imagick->readImage('file.pdf'); 

2 个答案:

答案 0 :(得分:0)

这应该可以分多步完成,但这里有一行:

df1[sapply(strsplit(as.character(df1[,3]),','),function(x) sum(x %in% as.character(df2[,1]))>0),]

strsplit()函数使用分隔符df拆分,第3列中的值,并返回如下所示的列表:

[[1]]
[1] "A" "C" "D" "F"

[[2]]
[1] "A" "D"

[[3]]
[1] "B" "F"

[[4]]
[1] "K" "P" "Z"

[[5]]
[1] "B" "C" "D" "H"

现在我们要检查该列表的每个元素是否在d2的第1列中至少有一个值。一种方法是使用%in%。如果我们将strsplit()的输出放入l1,我们可以像这样测试列表元素:

l1[[1]] %in% df2[,1]
[1] TRUE TRUE TRUE TRUE

但我们只需要知道一个是否属实:

sum(l1[[1]] %in% df2[,1])>0
[1] TRUE

由于我们想要在列表的所有元素上应用它并返回一个向量,我将它放入一个函数并使用sapply()。和所有事情一样,这可能是一种更快捷,更清洁的方式,但这是一种方式。

答案 1 :(得分:0)

使用@ AnandaMahto的splitstackshape包,任务变得更容易。在这种方法中,我们在将目标列分成行之后使用merge。请确保您没有因素。您可以查看sapply(df1, class)。您可以在不使用stringsAsFactors=FALSEdf1[] <- lapply(df1, as.character)

的因素的情况下阅读您的数据
library(splitstackshape)
df1.long <- cSplit(df1, "V3", direction="long")
m <- merge(df2, df1.long, by.x='V1', by.y='V3')
result2 <- aggregate(. ~ V2.y, m, toString)
#     V2.y         V1               V2.x
# 1  apple A, C, D, F Jan, Mar, Apr, Jun
# 2 orange B, C, D, H Feb, Mar, Apr, Aug
# 3   pear       A, D           Jan, Apr
# 4   plum       B, F           Feb, Jun

数据

df <- read.table(text="1 apple A,C,D,F  
2 pear A,D  
3 plum B,F  
4 banana K,P,Z  
5 orange B,C,D,H", stringsAsFactors=FALSE)
df1 <- df[-1]

df2 <- read.table(text="A Jan  
B Feb  
C Mar  
D Apr  
E May  
F Jun  
G Jul  
H Aug  
I Sept  
J Oct ", stringsAsFactors=FALSE)