R:将字符添加到数据框列表中不断变化的列数

R: Adding characters to a changing number of columns in list of dataframes

我的脚本处理来自多个站点的数据(每个站点一个 df),组织在数据帧列表中。对于后续分析,我已经将来自所有其他站点(matchID、字符)的匹配 ID 添加到每个站点(数据框)。根据每个项目 (=list, data) 中站点 (=dataframes) 的数量,有不同数量的名为“matchID”的列(没有重复的名称)。我需要更改这些字符串以将站点 ID (ID) 添加到“matchID”,因此结果将是“ID_matchID”。通常,我会通过 'paste()' 执行此操作,但由于要添加 ID 的列数可能会因项目中站点的数量以及列表中数据帧的数量而异,因此我需要在不显式使用列索引的情况下将字符添加到多个字符串(我认为)。我将不胜感激任何帮助,尤其是有关如何处理这些 NA 条目的提示。

这是我到目前为止尝试过的方法:

  1. WORKS - 提取所有包含匹配 ID 的相关列(因为所有数据帧的组织方式完全相同(列数和定位),我可以只使用 [[1]]):
indx_match<-as.numeric(grep("match", colnames(data[[1]])))
  1. 不起作用 - 然后将 ID 添加到所有 matchID 列不起作用,导致第二个 x[indx_match] 炸毁一切。
result<-lapply(data,function(x){x[,indx_match]<-paste(x$ID,x[,indx_match],sep="_");x})

数据可能如下所示(在此示例中只有 3 个站点,因此有两个 matchID 列:

> data
[[1]]
datetime            ID    matchID_50 matchID_51
2019-03-01 07:00:00 49         NA         NA
2019-03-01 07:10:00 49         NA         NA
2019-03-01 07:20:00 49    50_09_3    51_11_6
2019-03-01 07:30:00 49    50_12_6    51_05_6
2019-03-01 07:40:00 49    50_11_4    51_11_6
[[2]]
datetime            ID    matchID_49 matchID_51
2019-03-01 07:00:00 50    49_12_6    51_11_6
2019-03-01 07:10:00 50    49_21_6    51_32_0
2019-03-01 07:20:00 50    49_09_3    51_11_3
2019-03-01 07:30:00 50    49_12_6    51_05_6
2019-03-01 07:40:00 50    49_11_4    51_13_9
[[3]]
datetime            ID    matchID_49 matchID_50
2019-03-01 07:00:00 51         NA    50_14_1
2019-03-01 07:10:00 51    49_09_3         NA
2019-03-01 07:20:00 51    49_09_3    50_14_1
2019-03-01 07:30:00 51    49_12_5    50_01_7
2019-03-01 07:40:00 51    49_08_3    50_11_8

这就是理想的结果:

> result
[[1]]
datetime            ID    matchID_50    matchID_51
2019-03-01 07:00:00 49            NA            NA
2019-03-01 07:10:00 49            NA            NA
2019-03-01 07:20:00 49    49_50_09_3    49_51_11_6
2019-03-01 07:30:00 49    49_50_12_6    49_51_05_6
2019-03-01 07:40:00 49    49_50_11_4    49_51_11_6
[[2]]
datetime            ID    matchID_49    matchID_51
2019-03-01 07:00:00 50    50_49_12_6    50_51_11_6
2019-03-01 07:10:00 50    50_49_21_6    50_51_32_0
2019-03-01 07:20:00 50    50_49_09_3    50_51_11_3
2019-03-01 07:30:00 50    50_49_12_6    50_51_05_6
2019-03-01 07:40:00 50    50_49_11_4    50_51_13_9
[[3]]
datetime            ID    matchID_49    matchID_50
2019-03-01 07:00:00 51            NA    51_50_14_1
2019-03-01 07:10:00 51    51_49_09_3            NA
2019-03-01 07:20:00 51    51_49_09_3    51_50_14_1
2019-03-01 07:30:00 51    51_49_12_5    51_50_01_7
2019-03-01 07:40:00 51    51_49_08_3    51_50_11_8

我猜你正在寻找

library(dplyr)
result<-lapply(data,function(x){
  x %>% mutate_at(vars(matches("match")),function(z){ifelse(!is.na(z),paste0(.$ID,"_",z),z)})
})