首页 > 解决方案 > 存在空字符串时如何在R中合并数据框

问题描述

作为一个复杂过程的输出,我有两个数据文件,它们基本上如下所示:

date1 <- c("2021-01-01", "2021-01-02", "", "")
X1 <- c("foo", "bar", "", "")
date2 <- c("", "", "2021-01-03", "2021-01-04")
X2 <- c("", "", "bar", "foo")

file1 <- data.frame(date = date1, X = X1)
file2 <- data.frame(date = date2, X = X2)

> file1
        date   X
1 2021-01-01 foo
2 2021-01-02 bar
3               
4               
> file2
        date   X
1               
2               
3 2021-01-03 bar
4 2021-01-04 foo

请注意,空白行是空字符串,而不是 NA。另请注意,在我的真实数据中,文件 1 中的所有空白行都有文件 2 中的数据,文件 2 中的所有空白行都有文件 1 中的数据。

我想要的是通过用另一个文件中的数据替换空字符串来合并这些数据:

desired_date <- c("2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04")
desired_X <- c("foo", "bar", "bar", "foo")
desired <- data.frame(date = desired_date, X = desired_X)

> desired
        date   X
1 2021-01-01 foo
2 2021-01-02 bar
3 2021-01-03 bar
4 2021-01-04 foo

如果丢失的数据是 NA,我觉得我可以这样做,但空字符串似乎把我弄乱了。帮助?

标签: r

解决方案


假设这两个数据帧的顺序是稳定的,这可以通过选择缺失的行并用另一行中相应的非空行填充它们来完成。

file3 <- file1
file3[file3$date == "", ] <- file2[file2$date != "", ]
file3

# 
# date   X
# 1 2021-01-01 foo
# 2 2021-01-02 bar
# 3 2021-01-03 bar
# 4 2021-01-04 foo

我创建了一个新对象file3,以防万一您不想修改原始对象。如果您不介意覆盖原件,可以将其缩短为:

file1[file1$date == "", ] <- file2[file2$date != "", ]

编辑:@jay.sf 询问这将如何与数据中的 NA 一起使用。我已经扩展了 OP 的原始示例,以展示我将如何在我的方法中处理 NA:

date1 <- c("2021-01-01", "2021-01-02", "", "", NA)
X1 <- c("foo", "bar", "", "", NA)
date2 <- c("", "", "2021-01-03", "2021-01-04", "2021-01-05")
X2 <- c("", "", "bar", "foo", "bar")

file1 <- data.frame(date = date1, X = X1)
file2 <- data.frame(date = date2, X = X2)

file1
# > file1
# date    X
# 1 2021-01-01  foo
# 2 2021-01-02  bar
# 3                
# 4                
# 5       <NA> <NA>

file2
# > file2
# date   X
# 1               
# 2               
# 3 2021-01-03 bar
# 4 2021-01-04 foo
# 5 2021-01-05 bar

file3 <- file1
empty_rows <- file1$date == "" | is.na(file1$date)
file3[empty_rows, ] <- file2[empty_rows, ]
file3

# > file3
# date   X
# 1 2021-01-01 foo
# 2 2021-01-02 bar
# 3 2021-01-03 bar
# 4 2021-01-04 foo
# 5 2021-01-05 bar

我通过创建对象 对其进行了一些合并,该对象empty_rows是一个逻辑指示行,file1其中包含空文本或NA.


推荐阅读