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
条目的提示。
这是我到目前为止尝试过的方法:
- WORKS - 提取所有包含匹配 ID 的相关列(因为所有数据帧的组织方式完全相同(列数和定位),我可以只使用 [[1]]):
indx_match<-as.numeric(grep("match", colnames(data[[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)})
})
我的脚本处理来自多个站点的数据(每个站点一个 df),组织在数据帧列表中。对于后续分析,我已经将来自所有其他站点(matchID
、字符)的匹配 ID 添加到每个站点(数据框)。根据每个项目 (=list, data
) 中站点 (=dataframes) 的数量,有不同数量的名为“matchID”的列(没有重复的名称)。我需要更改这些字符串以将站点 ID (ID
) 添加到“matchID”,因此结果将是“ID_matchID”。通常,我会通过 'paste()' 执行此操作,但由于要添加 ID 的列数可能会因项目中站点的数量以及列表中数据帧的数量而异,因此我需要在不显式使用列索引的情况下将字符添加到多个字符串(我认为)。我将不胜感激任何帮助,尤其是有关如何处理这些 NA
条目的提示。
这是我到目前为止尝试过的方法:
- WORKS - 提取所有包含匹配 ID 的相关列(因为所有数据帧的组织方式完全相同(列数和定位),我可以只使用 [[1]]):
indx_match<-as.numeric(grep("match", colnames(data[[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)})
})