如何根据部分变量名称合并多个数据帧列表中的多列?

问题描述 投票:0回答:1

我有一长串数据帧,其中每个数据帧中都有一些列需要根据名称合并。也就是说,包含

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 coalesce mutate
1个回答
0
投票

这是基本 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
© www.soinside.com 2019 - 2024. All rights reserved.