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