如何用R语言中数据框列内容给列表内数据框列名加后缀
解决方案:使用lapply批量修改列表中DataFrame的列名
当然可以通过lapply实现需求,先梳理你之前代码的问题,再给出可行方案:
你之前的错误分析
- 第一个代码错误:
dflist是列表对象,不能直接用colnames()操作,且dflist[[]]缺少下标,语法不合法——colnames()仅适用于单个DataFrame,而非列表。 - 第二个代码错误:在
lapply的匿名函数中,参数i已经是列表中的单个DataFrame,无需再通过dflist[[i]]取值;且dflist[[i]]$d的写法错误,因为i是DataFrame对象而非索引值。
正确实现代码
set.seed(42) df1 <- data.frame(a=runif(5), b=runif(5), c=runif(5), d=rep("2019-01-01", 5)) df2 <- data.frame(a=runif(5), b=runif(5), c=runif(5), d=rep("2018-01-01", 5)) dflist <- list(df1, df2) # 批量修改列名并删除d列 dflist <- lapply(dflist, function(df) { # 提取后缀:取d列第一个值的前4个字符(因d列值全重复) suffix <- substr(df$d[1], 1, 4) # 筛选需要修改列名的列(排除d列) target_cols <- setdiff(names(df), "d") # 修改列名 names(df)[names(df) %in% target_cols] <- paste(target_cols, suffix, sep = "_") # 删除d列,返回处理后的DataFrame df[, target_cols] }) # 查看结果 dflist
代码说明
lapply(dflist, function(df):遍历列表中的每个DataFrame,用df指代当前处理的DataFrame;substr(df$d[1], 1, 4):由于d列所有值完全重复,仅取第一个值的前4个字符作为后缀,提升效率;setdiff(names(df), "d"):获取除d列外的所有列名,避免误修改d列;- 修改目标列的名称后,删除
d列,返回处理后的DataFrame。
运行上述代码后,得到的结果与你预期的完全一致。
内容的提问来源于stack exchange,提问作者jvalenti
相关产品推荐
相关产品推荐

