我有一长串数据帧,其中每个数据帧中都有一些列需要根据名称合并。也就是说,包含
Duo:
的列中的值应替换其名称等于 Duo:
后面的字符串的列中相应行中的值。例如,Duo:side
中的非NA值应替换side
列中的相应值。请查看下面的数据和所需的输出:
data <- list(foo = structure(list(id = c("AA", "BB", "CC", "NN"), bodyPart = c("leg", "arm", "knee", "eye"), side = c("LEFT", "RIGHT", "LEFT", "LEFT"), device = c("LLI", "LSM", "GHT", "LLM"), length = c(12, 476,
7, 2), mwID = c("a12", "k87", "j98", NA), `Duo:length` = c(23, NA, 77, NA)), row.names = c(NA, -4L), class = "data.frame"), bar = structure(list(id = c("DC", "DD", "FF", "ZZ"), bodyPart = c("ARM", "ear", "knee", "ankel"), side = c("RIGHT", "RIGHT", "RIGHT",
"LEFT"), device = c("RWS", "LSM", "YYY", "GOM"), tqID = c("fg12", "ll23", "sc26", "kj8"), `Duo:side` = c(NA, "LEFT", "LEFT", NA), `Duo:device` = c(NA, NA, NA, "GGT")), row.names = c(NA, -4L), class = "data.frame"))
output <- list(foo = structure(list(id = c("AA", "BB", "CC", "NN"), bodyPart = c("leg", "arm", "knee", "eye"), side = c("LEFT", "RIGHT", "LEFT", "LEFT"), device = c("LLI", "LSM", "GHT", "LLM"), length = c(23, 476,
77, 2), mwID = c("a12", "k87", "j98", NA)), row.names = c(NA, -4L), class = "data.frame"), bar = structure(list(id = c("DC", "DD", "FF", "ZZ"), bodyPart = c("ARM", "ear", "knee", "ankel"), side = c("RIGHT", "LEFT", "LEFT",
"LEFT"), device = c("RWS", "LSM", "YYY", "GGT"), tqID = c("fg12", "ll23", "sc26", "kj8")), row.names = c(NA, -4L), class = "data.frame"))
我所做的是以下仅适用于一个数据框,但仍然存在问题;我想要删除合并的列。我知道如何单独删除它,但一次性删除它会很棒。我会很感激你的建议。
dplyr::mutate(data$foo, length = dplyr::coalesce(`Duo:length`, length))
这是基本 R 中的一种方法。我还建议检查函数
dplyr::rows_update
,在这种情况下可能会派上用场:
out <- lapply(data, \(x){
duo = grep("Duo", colnames(x), value = TRUE)
og = gsub("Duo\\:\\.", "", duo)
x[og] <- mapply(\(y, z) ifelse(complete.cases(z), z, y), x[og], x[duo])
x[-grep("Duo", colnames(x))]
})
# $foo
# id bodyPart side device length mwID
# 1 AA leg LEFT LLI 23 a12
# 2 BB arm RIGHT LSM 476 k87
# 3 CC knee LEFT GHT 77 j98
# 4 NN eye LEFT LLM 2 <NA>
#
# $bar
# id bodyPart side device tqID
# 1 DC ARM RIGHT RWS fg12
# 2 DD ear LEFT LSM ll23
# 3 FF knee LEFT YYY sc26
# 4 ZZ ankel LEFT GGT kj8