R 将数据帧中的值与列中的值匹配
我有两个data.Frame,看起来像这样:R 将数据帧中的值与列中的值匹配,r,R,我有两个data.Frame,看起来像这样: >df1 V1 a b c d e >df2 V1 V2 1 a,k,l 2 c,m,n 3 z,b,s 4 l,m,e 5 t,r,d 我想将df1$V1中的值与df2$V2中的值进行匹配,并在df1中添加一个新列,该列对应于匹配和df2$V1的值,所需输出为: >df1 V1 V2 a 1 b 3 c 2 d 5 e 4
>df1
V1
a
b
c
d
e
>df2
V1 V2
1 a,k,l
2 c,m,n
3 z,b,s
4 l,m,e
5 t,r,d
我想将df1$V1
中的值与df2$V2
中的值进行匹配,并在df1
中添加一个新列,该列对应于匹配和df2$V1
的值,所需输出为:
>df1
V1 V2
a 1
b 3
c 2
d 5
e 4
我尝试过这种方法,但只有当df2$V2
只包含一个元素时,这种方法才有效:
match(as.character(df1[,1]), strsplit(as.character(df2[,2], ",")) -> idx
df1$V2 <- df2[idx,1]
match(作为.character(df1[,1]),strsplit(作为.character(df2[,2],“,”)))->idx
df1$V2您只需使用grep
,它将返回找到的字符串的位置:
sapply(df1$V1, grep, x = df2$V2)
# a b c d e
# 1 3 2 5 4
如果希望重复,可以使用粘贴
让我们修改您的数据,以便重复:
df2$V2[3] <- "z,b,s,a"
以下是一种方法:
library(qdap)
key <- setNames(strsplit(as.character(df2$V2), ","), df2$V1)
df1$V2 <- as.numeric(df1$V1 %l% key)
df1
## V1 V2
## 1 a 1
## 2 b 3
## 3 c 2
## 4 d 5
## 5 e 4
库(qdap)
键与泰勒的答案相似,但在底部使用stack
:
df.stack <- stack(setNames(strsplit(as.character(df2$V2), ","), df2$V1))
transform(df1, V2=df.stack$ind[match(V1, df.stack$values)])
与grep相比,拆分的一个优点是,使用grep,您可能会搜索a
并匹配alabama
等内容(尽管您可以小心使用模式来缓解这种情况(即包括单词边界等)
注意,这将只找到第一个匹配值。例如,“a”在df2$V2
中出现多次会怎样?结果应该是什么?感谢@AnandaMahto的注释,df1$V1
中的值在df2$V2
中只出现一次,但如果有任何重复,则这两个值用冒号分隔“,”将是完美的
df.stack <- stack(setNames(strsplit(as.character(df2$V2), ","), df2$V1))
transform(df1, V2=df.stack$ind[match(V1, df.stack$values)])
V1 V2
1 a 1
2 b 3
3 c 2
4 d 5
5 e 4