r - 存在空字符串时如何在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,我觉得我可以这样做,但空字符串似乎把我弄乱了。帮助?
解决方案
假设这两个数据帧的顺序是稳定的,这可以通过选择缺失的行并用另一行中相应的非空行填充它们来完成。
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
.
推荐阅读
- json - Haskell Aeson 如何用列表值解析键?
- c++ - 打印我正在寻找的值的困难,但使用 memcpy() 解决了 - 为什么?
- firebase - 任何人都可以帮我编辑亚马逊等电子商务应用的 Firebase 规则吗
- c# - Entity Framework Core 6 代码优先中由 DESC 排序的聚集索引
- javascript - Helpers.GoogleCharts.ChartOne.Options 未定义
- python - 使用 Tensorflow 中的有限差分计算四阶导数的准确性
- freemarker - 需要显示日期的前四个字母(freemarker)
- javascript - 使用 vanilla JS 且没有包管理器的 vscode chrome 调试 - 未绑定断点
- r - 如何删除向量的每个第三个元素?
- excel - 在 DataPresenterExcelExporter.Export 期间打击 Excel 公式注入