Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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:dplyr:在匹配的地方转换;否则保持_R_If Statement_Join_Dplyr - Fatal编程技术网

R:dplyr:在匹配的地方转换;否则保持

R:dplyr:在匹配的地方转换;否则保持,r,if-statement,join,dplyr,R,If Statement,Join,Dplyr,我有一个长数据框(大约10 mill.rows),每行有一个唯一的键(是列的组合)和一个值向量 我有一个带有唯一键的短数据帧,它与长数据帧中的几个键相匹配。这些匹配键标识第二个数据帧的值列中提供的替换值。第二个数据帧中的所有键都应该与第一个数据帧中的一个键完全匹配,尽管顺序可能不同。我想高效地生成一个新的数据帧,其中第一个值不匹配,第二个值匹配。我觉得应该有这样一个连接,但我还没有确定它 df1 <- tibble(let = c("a", "b", "a", "b"), num = c(

我有一个长数据框(大约10 mill.rows),每行有一个唯一的键(是列的组合)和一个值向量

我有一个带有唯一键的短数据帧,它与长数据帧中的几个键相匹配。这些匹配键标识第二个数据帧的值列中提供的替换值。第二个数据帧中的所有键都应该与第一个数据帧中的一个键完全匹配,尽管顺序可能不同。我想高效地生成一个新的数据帧,其中第一个值不匹配,第二个值匹配。我觉得应该有这样一个连接,但我还没有确定它

df1 <- tibble(let = c("a", "b", "a", "b"), num = c(1, 1, 2, 2), val = c(.1, .2, .3, .4))
df1 <- tibble(let = c("a", "b"), num = c(1, 2), val = c(.5, .6))

df1 %>%
out <- transmute(let = let, num = num, unknown_fn(df2, by = c("let", "num"))

一种方法是通过
let
num
使用
left\u-join
,并使用
colaesce
替换
NA

library(dplyr)

left_join(df1, df2, by = c("let", "num")) %>%
     mutate(val = coalesce(val.y, val.x)) %>%
     select(names(df1))


# A tibble: 4 x 3
#  let     num   val
#  <chr> <dbl> <dbl>
#1 a         1   0.5
#2 b         1   0.2
#3 a         2   0.3
#4 b         2   0.6
数据

df1 <- tibble(let = c("a", "b", "a", "b"), num = c(1, 1, 2, 2), 
               val = c(.1, .2, .3, .4))
df2 <- tibble(let = c("a", "b"), num = c(1, 2), val = c(.5, .6))

df1或使用
数据表

setDT(df1)
setDT(df2)

df1[df2, on = .(let = let, num = num), val := i.val]

   let num val
1:   a   1 0.5
2:   b   1 0.2
3:   a   2 0.3
4:   b   2 0.6


也可能会提高您的性能。

对我很有用!我在我的真实数据上尝试了这两种方法——第一种要快得多。
df1 <- tibble(let = c("a", "b", "a", "b"), num = c(1, 1, 2, 2), 
               val = c(.1, .2, .3, .4))
df2 <- tibble(let = c("a", "b"), num = c(1, 2), val = c(.5, .6))
setDT(df1)
setDT(df2)

df1[df2, on = .(let = let, num = num), val := i.val]

   let num val
1:   a   1 0.5
2:   b   1 0.2
3:   a   2 0.3
4:   b   2 0.6