Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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_Dataframe - Fatal编程技术网

R 基于数据框中的多列查找值

R 基于数据框中的多列查找值,r,dataframe,R,Dataframe,我试图找出如何使用多列查找值。只是似乎无法让它正常工作。以下是一个例子: df1 <- data.frame(g1 = c("a", "b", "c", "c"), g2 = c(1, 2, 3, 4)) df2 <- data.frame(g.1 = c("a", "b", "c"), g.2 = c(1, 2, 4), val = c(100, 200, 300)) 使用合并尝试左连接: merge(df1, df2, by = 1:2, all.x = TRUE) 给予:

我试图找出如何使用多列查找值。只是似乎无法让它正常工作。以下是一个例子:

df1 <- data.frame(g1 = c("a", "b", "c", "c"), g2 = c(1, 2, 3, 4))
df2 <- data.frame(g.1 = c("a", "b", "c"), g.2 = c(1, 2, 4), val = c(100, 200, 300))

使用
合并
尝试左连接:

merge(df1, df2, by = 1:2, all.x = TRUE)
给予:

  g1 g2 val
1  a  1 100
2  b  2 200
3  c  3  NA
4  c  4 300
有些备选方案是:

transform(df1, val = df2$val[match(paste(g1, g2), paste(df2$g.1, df2$g.2))])

library(sqldf)
sqldf("select df1.*, df2.val 
       from df1 left join df2 on g1 = [g.1] and g2 = [g.2]")

library(dplyr)
df1 %>% left_join(df2, by = c(g1 = "g.1", g2 = "g.2"))

连接会更好,并且有了
data.table
,当我们更新我的引用时,它会变得更有效

library(data.table)
setDT(df1)[df2, value := val, on = .(g1 = g.1, g2 = g.2)]
df1
#    g1 g2 value
#1:  a  1   100
#2:  b  2   200
#3:  c  3    NA
#4:  c  4   300

使用
match
,一种方法是
将感兴趣的列粘贴在一起,然后创建一个索引来更改值

p1 <- do.call(paste, df1)
p2 <- do.call(paste, df2[1:2])
i1 <- match(p1, p2, nomatch = 0)
i2 <- match(p2, p1, nomatch = 0)
df1$value[i2] <- df2$val[i1]
df1
#  g1 g2 value
#1  a  1   100
#2  b  2   200
#3  c  3    NA
#4  c  4   300

p1我根据@G.Grothendieck的答案找出了我做错了什么。我所要做的就是:

df1$value <- df2[match(paste0(df1$g1,df1$g2), paste0(df2$g.1,df2$g.2)),]$val

df1$value只需执行一个join
setDT(df1)[df2,value:=val,on=(g1,g2)]
另外,
match
返回数字索引,因此
&
不会按照您的要求工作。setDT是基R的一部分吗?(如果可能,尽量保持在基本R包内,但也对其他包感兴趣)这是data.table语法,但如果您想要基本R,则
merge
是better@akrun请随意添加这一点作为回答,以显示组列是不同的。所以我想我需要在merge中使用“by”。
p1 <- do.call(paste, df1)
p2 <- do.call(paste, df2[1:2])
i1 <- match(p1, p2, nomatch = 0)
i2 <- match(p2, p1, nomatch = 0)
df1$value[i2] <- df2$val[i1]
df1
#  g1 g2 value
#1  a  1   100
#2  b  2   200
#3  c  3    NA
#4  c  4   300
df1$value <- df2[match(paste0(df1$g1,df1$g2), paste0(df2$g.1,df2$g.2)),]$val