我有一个all_input
包含13个数据帧的列表。这些df具有不同数量的列,有时具有不同的列标题。我需要的每个df中都有6列,我需要它们都具有相同的名称,如下所示
header_cols <- c( "tribal_name", "st_usps_cd", "scc", "description", "total_emissions", "uom" )
有些df已经具有正确的名称,有些则没有。有些具有正确名称的几列,而其余的则没有。例如,对于我需要称为“描述”的列,一个df可能具有“ pollutant_desc”,而另一个可能具有“污染物”。
有办法改变吗?我的计划是制作一个映射文件,该文件将具有当前列名的一列和目标列名的一列,例如:
current target
pollutant_desc description
pollutant description
tribe tribal_name
tribes tribal_name
tribe_name tribal_name
但是,这可能会有问题,因为将来会添加更多的df,而它们的名称可能不会出现在映射文件中。我考虑过使用如下ifelse语句:
if ( "pollutant_desc" %in% colnames() ) {
rename( description = pollutant_desc )
}
但不确定如何格式化列表中多个数据框的格式,以及在存在多个不同的标头名称时的格式。有什么建议?
如果所有数据框中都存在所需的所有6列,那么查找方法对我来说听起来不错。
这是一个使用4列的示例。
创建一个查找表和一些虚假数据
lookup_table <- data.frame(orignal_col = c('col1', 'col2', 'col3', 'col4'),
new_col = c( "tribal_name", "st_usps_cd", "scc", "description"))
df1 <- data.frame(a = 1:3, col1 = 1:3, col2 = 3:5, col3 = 4:6, col4 = 2:4)
df2 <- data.frame(a = 1:3, col1 = 1:3, b = 1:3,col2 = 3:5, col3 = 4:6, col4 = 2:4)
all_input <- list(df1, df2)
all_input
#[[1]]
# a col1 col2 col3 col4
#1 1 1 3 4 2
#2 2 2 4 5 3
#3 3 3 5 6 4
#[[2]]
# a col1 b col2 col3 col4
#1 1 1 1 3 4 2
#2 2 2 2 4 5 3
#3 3 3 3 5 6 4
我们可以lapply
在列表上使用match
,并用来替换列名。
lapply(all_input, function(x) {
names(x)[match(lookup_table$orignal_col, names(x))] <- lookup_table$new_col
x
})
#[[1]]
# a tribal_name st_usps_cd scc description
#1 1 1 3 4 2
#2 2 2 4 5 3
#3 3 3 5 6 4
#[[2]]
# a tribal_name b st_usps_cd scc description
#1 1 1 1 3 4 2
#2 2 2 2 4 5 3
#3 3 3 3 5 6 4
请注意,除了常见的4列之外,两个数据框都具有一些其他列,但是名称仅针对4列更改,其余部分保持不变。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句