我想对包含数据帧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');
答案 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=FALSE
或df1[] <- 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)