Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 在df1中的键数组中查找df2中的键并合并相应的值_Arrays_R_Merge_Lookup - Fatal编程技术网

Arrays 在df1中的键数组中查找df2中的键并合并相应的值

Arrays 在df1中的键数组中查找df2中的键并合并相应的值,arrays,r,merge,lookup,Arrays,R,Merge,Lookup,我有df1 df1 <- data.frame(states = c("wash", "mont", "oreg", "cali", "michi"), key1 = c(1,3,5,7,9), key2 = c(2,4,6,8,10)) df2有其他信息 df2 <- data.frame(sample = c(9,8,5,4,1), value = c("steel", "gold", "blue", "grey", "green")) df2中的样本需要与df1中的key1

我有df1

df1 <- data.frame(states = c("wash", "mont", "oreg", "cali", "michi"), key1 = c(1,3,5,7,9), key2 = c(2,4,6,8,10))
df2有其他信息

df2 <- data.frame(sample = c(9,8,5,4,1), value = c("steel", "gold", "blue", "grey", "green"))
df2中的样本需要与df1中的key1或key2匹配,才能生成df3

  states key1 key2 sample value
1   wash    1    2      1 green
2   mont    3    4      4  grey
3   oreg    5    6      5  blue
4   cali    7    8      8  gold
5  michi    9   10      9 steel
然后我就可以删除样本列了…没问题。如果sample的值可以在key1或key2中,如何将df2扩展到df3


谢谢

您可以使用几个
合并
调用并绑定它们的输出:

rbind(transform(merge(df1, df2, by.x = "key1", by.y = "sample"), sample = key1),
      transform(merge(df1, df2, by.x = "key2", by.y = "sample"), sample = key2))
#   key1 states key2 value sample
# 1    1   wash    2 green      1
# 2    5   oreg    6  blue      5
# 3    9  michi   10 steel      9
# 4    3   mont    4  grey      4
# 5    7   cali    8  gold      8
另一种方法:

match.idx <- pmax(match(df1$key1, df2$sample),
                  match(df1$key2, df2$sample), na.rm = TRUE)
cbind(df1, df2[match.idx, ])
#   states key1 key2 sample value
# 5   wash    1    2      1 green
# 4   mont    3    4      4  grey
# 3   oreg    5    6      5  blue
# 2   cali    7    8      8  gold
# 1  michi    9   10      9 steel

match.idx一种方法是通过将
key1
df2$sample
key2
df2$sample
匹配来创建一个新的键列,然后您可以直接加入。我将使用
data.table
来说明这一点

require(data.table) ## >= 1.9.0
setDT(df1)          ## convert data.frame to data.table by reference
setDT(df2)          ## idem

# get the key as a common column
df1[(key1 %in% df2$sample), the_key := key1]
df1[(key2 %in% df2$sample), the_key := key2]
此处
:=
再次通过引用指定一个新列(不复制)。现在剩下的就是
setkey
join

# setkey and join
setkey(df1, the_key)
setkey(df2, sample)
df1[df2]

#    states key1 key2 the_key value
# 1:   wash    1    2       1 green
# 2:   mont    3    4       4  grey
# 3:   oreg    5    6       5  blue
# 4:   cali    7    8       8  gold
# 5:  michi    9   10       9 steel

这是一个异或,即它是否匹配键1或键2,但决不匹配两者?是的,键1和键2之间没有重复的键
require(data.table) ## >= 1.9.0
setDT(df1)          ## convert data.frame to data.table by reference
setDT(df2)          ## idem

# get the key as a common column
df1[(key1 %in% df2$sample), the_key := key1]
df1[(key2 %in% df2$sample), the_key := key2]
# setkey and join
setkey(df1, the_key)
setkey(df2, sample)
df1[df2]

#    states key1 key2 the_key value
# 1:   wash    1    2       1 green
# 2:   mont    3    4       4  grey
# 3:   oreg    5    6       5  blue
# 4:   cali    7    8       8  gold
# 5:  michi    9   10       9 steel