0

我有一组重复的数据:

x <- tibble(num=c(1,2,3,2,5,5,8), alph=NA)

并单独的来源给出相应的值。

y <- tibble(num=1:4, alph=LETTERS[1:4])
z <- tibble(num=5:10, alph=LETTERS[5:10])

通常,人们会使用此代码来更新x$num来自y.

x$alph <- y$alph[match(x$num,y$num)]

尽管如此,这样做z会覆盖已经存在的内容并用sy替换它们。NA

我如何编码以便可以累积更新数据?使用:

x$alph[which(x$num %in% z$num)] <- y$alph[which(z$num %in% x$num)]

由于重复而不起作用。

4

1 回答 1

1

在这里,我提供了三个使用tidyverse. x2, x4, 和x5是最终输出。

y我们可以从和创建组合数据帧z,然后与 执行连接x

# Load packages
library(tidyverse)

# Create example data frames
x <- tibble(num=c(1,2,3,2,5,5,8), alph=NA)
y <- tibble(num=1:4, alph=LETTERS[1:4])
z <- tibble(num=5:10, alph=LETTERS[5:10])

# Create combined table from y and z
yz <- bind_rows(y, z)

# Perform join
x2 <- x %>% 
  select(-alph) %>%
  left_join(yz, by = "num")
x2
# # A tibble: 7 x 2
#     num  alph
#   <dbl> <chr>
# 1     1     A
# 2     2     B
# 3     3     C
# 4     2     B
# 5     5     E
# 6     5     E
# 7     8     H

或者使用reduce合并所有数据框,然后选择不NA构建新数据框的那一个。

x3 <- reduce(list(x, y, z), left_join, by = "num")
x4 <- tibble(num = x3$num,
             alph = apply(x3[, -1], 1, function(x) x[!is.na(x)]))
x4
# # A tibble: 7 x 2
#     num  alph
#   <dbl> <chr>
# 1     1     A
# 2     2     B
# 3     3     C
# 4     2     B
# 5     5     E
# 6     5     E
# 7     8     H

或在reduceand之后joingather用于删除NA值。

x3 <- reduce(list(x, y, z), left_join, by = "num")
x5 <- x3 %>% 
  gather(Type, alph, -num, na.rm = TRUE) %>%
  select(-Type)
x5
# # A tibble: 7 x 2
#     num  alph
#   <dbl> <chr>
# 1     1     A
# 2     2     B
# 3     3     C
# 4     2     B
# 5     5     E
# 6     5     E
# 7     8     H
于 2017-11-11T22:02:46.047 回答