如何用 excel 文件中的数据替换某些列?
How can I replace some columns with data from an excel file?
我有一个问题。正如标题所说,现在我需要用来自另一个 excel 文件的新数据替换一些列。当满足某些要求时,我需要更换它们。
例如,我想用另一个excel文件中的新数据将R5列替换为APM(任意列header名称,仅作为示例),并且在替换之前应满足以下条件:
- replace with the same ID,也就是说我希望替换的时候每个人的ID都匹配
- 行中某列显示“N”时不替换。例如,如果一行中 R5 到 APM 之间的任何单元格有一个 N,则不要替换它。
基本上,我想确保数据完全匹配。
如何在 R 中完成此任务?或者,如何在 MS Excel 中实现它?
非常感谢您的帮助!我将非常感激每一个答案。
下面是一个例子:
以下为文字版截图:
身份证号码
11 2021/4/15 N 9/11/66 56.9 175 cm 标准测试 22 N/A
11 2021/7/29 Y 9/11/66 55.7 186 cm 标准测试 748 N/A 11 2021/7/29 Y TWCOVID 11 1966/11/9 F 白种人 157 54 NO NO
在下面的屏幕截图中,我想将ID为11的新数据替换为指示Y的行,并将旧数据替换为从R5开始到APM结束的新数据。我可以肯定地说,每个新数据的长度与旧数据的长度完全相同。
如果我对你的问题理解正确,你想做的事情可以通过函数merge()
来实现。做?merge
获取更多信息。
重要的是两个数据框中的列以相同的方式命名
示例如下:
在这里,您将读取两个数据集,然后确保具有匹配信息的列名称与下一个数据集相同(在您的情况下,您需要 ID ("ID ")、日期("date")、是否合并的决定("test")匹配。
library(readxl)
dt1 <- read_excel("path to dataset 1")
dt2 <- read_excel("path to dataset 2")
colnames(dt1)<- c("ID","date","test","DOB","weigth","height","other1","other2","other3")
colnames(dt2)<- c("ID","date","test","variable")
但为了示例,我正在重新创建您的两个数据集:
dt1 <- data.frame(ID = c(11,11),
date = c("2021/4/15", "2021/7/29"),
test = c("N", "Y"),
DOB = c("9/11/66", "9/11/66"),
weight = c(56.9, 55.7),
heigth = c(175, 186),
other1 = "Standard Test",
other2 = c(22, 748),
other3 = NA)
dt2 <- data.frame(ID = 11,
date = "2021/7/29",
test = "Y",
variable = "TWCOVID")
然后,您可以通过指定要使用的列(尽管该函数会自动识别相同的列名称)并指定 all.x = TRUE 来合并 dt1 和 dt2 以表示所有来自数据框 x(第一个)的行必须被保留。根据您想要实现的目标,检查 all
和 all.x
之间的区别。
dt <- merge(x = dt1, y = dt2[dt2$test == "Y", ], by = c("ID", "date", "test"), all.x = TRUE)
它为您提供:(最后一列是您想要的信息。
然后,导出到excel:
library(writexl)
write_xlsx(dt)
我有一个问题。正如标题所说,现在我需要用来自另一个 excel 文件的新数据替换一些列。当满足某些要求时,我需要更换它们。
例如,我想用另一个excel文件中的新数据将R5列替换为APM(任意列header名称,仅作为示例),并且在替换之前应满足以下条件:
- replace with the same ID,也就是说我希望替换的时候每个人的ID都匹配
- 行中某列显示“N”时不替换。例如,如果一行中 R5 到 APM 之间的任何单元格有一个 N,则不要替换它。
基本上,我想确保数据完全匹配。
如何在 R 中完成此任务?或者,如何在 MS Excel 中实现它? 非常感谢您的帮助!我将非常感激每一个答案。
下面是一个例子:
以下为文字版截图:
身份证号码
11 2021/4/15 N 9/11/66 56.9 175 cm 标准测试 22 N/A
11 2021/7/29 Y 9/11/66 55.7 186 cm 标准测试 748 N/A 11 2021/7/29 Y TWCOVID 11 1966/11/9 F 白种人 157 54 NO NO
在下面的屏幕截图中,我想将ID为11的新数据替换为指示Y的行,并将旧数据替换为从R5开始到APM结束的新数据。我可以肯定地说,每个新数据的长度与旧数据的长度完全相同。
如果我对你的问题理解正确,你想做的事情可以通过函数merge()
来实现。做?merge
获取更多信息。
重要的是两个数据框中的列以相同的方式命名
示例如下:
在这里,您将读取两个数据集,然后确保具有匹配信息的列名称与下一个数据集相同(在您的情况下,您需要 ID ("ID ")、日期("date")、是否合并的决定("test")匹配。
library(readxl)
dt1 <- read_excel("path to dataset 1")
dt2 <- read_excel("path to dataset 2")
colnames(dt1)<- c("ID","date","test","DOB","weigth","height","other1","other2","other3")
colnames(dt2)<- c("ID","date","test","variable")
但为了示例,我正在重新创建您的两个数据集:
dt1 <- data.frame(ID = c(11,11),
date = c("2021/4/15", "2021/7/29"),
test = c("N", "Y"),
DOB = c("9/11/66", "9/11/66"),
weight = c(56.9, 55.7),
heigth = c(175, 186),
other1 = "Standard Test",
other2 = c(22, 748),
other3 = NA)
dt2 <- data.frame(ID = 11,
date = "2021/7/29",
test = "Y",
variable = "TWCOVID")
然后,您可以通过指定要使用的列(尽管该函数会自动识别相同的列名称)并指定 all.x = TRUE 来合并 dt1 和 dt2 以表示所有来自数据框 x(第一个)的行必须被保留。根据您想要实现的目标,检查 all
和 all.x
之间的区别。
dt <- merge(x = dt1, y = dt2[dt2$test == "Y", ], by = c("ID", "date", "test"), all.x = TRUE)
它为您提供:(最后一列是您想要的信息。
然后,导出到excel:
library(writexl)
write_xlsx(dt)