Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将数据帧中的值与列中的值匹配_R - Fatal编程技术网

R 将数据帧中的值与列中的值匹配

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

我有两个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
我尝试过这种方法,但只有当
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