用另一个数据框的索引值替换数据框中的值。

3

我有一种通过匹配id值来替换数据框中的值的方法。这在小型数据集上效果很好,但在大型数据集上表现不佳。请问是否有人有建议,如何使这个过程更加高效?

以下是我的R代码示例。我正在使用tidyverse包。

# Delta Array small test
test_df <- data.frame(ID = c(1,2,3,4,5,6,7,8,8,9),
                  val = c(1,NA,3,4,5,6,7,8,NA,9))

delta_test <- data.frame(ID = c(2,8,9),
                     val = c(2,100,50))

test_df$val <- ifelse(is.na(delta_test$val[match(test_df$ID, delta_test$ID)]),
                  test_df$val,
                  delta_test$val[match(test_df$ID, delta_test$ID)])

test_df
1个回答

4

您可以尝试使用coalescetest_dfdelta_test连接并选择第一个非NA值。

library(dplyr)

test_df <- test_df %>%
             left_join(delta_test, by = 'ID') %>%
             mutate(val = coalesce(val.y, val.x)) %>%
             select(ID, val)
test_df
#  ID val
#1   1   1
#2   2   2
#3   3   3
#4   4   4
#5   5   5
#6   6   6
#7   7   7
#8   8 100
#9   8 100
#10  9  50

在基本的R语言中,可以这样实现:
test_df <- transform(merge(test_df, delta_test, by = 'ID', all.x = TRUE),
                     val = ifelse(is.na(val.y), val.x, val.y))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接