首页 > 解决方案 > 为数据框列表中的每个数据框的每个列名称添加前缀 R

问题描述

我想为数据框列表中每个数据框中的每一列(第一列除外)添加一个前缀。我一直在采用用于单个数据框的方法,并尝试同时使用 lapply 和 Map 但没有成功。

我还想通过将数据框的名称添加为现有名称的前缀来更改每个数据框的第一列

我的数据框列表的片段

l1 <- list(Fe = structure(list(Determination_No = 1:6, `2` = c(55.94, 
55.7, 56.59, 56.5, 55.98, 55.93), `3` = c(56.83, 56.54, 56.18, 
56.5, 56.51, 56.34), `4` = c(56.39, 56.43, 56.53, 56.31, 56.47, 
56.35), `5` = c(56.32, 56.29, 56.31, 56.32, 56.39, 56.32), `7` = c(56.48, 
56.4, 56.54, 56.43, 56.73, 56.62), `8` = c(56.382, 56.258, 56.442, 
56.258, 56.532, 56.264), `10` = c(56.3, 56.5, 56.2, 56.5, 56.7, 
56.5), `12` = c(56.11, 56.46, 56.1, 56.35, 56.36, 56.37)), class = "data.frame", row.names = c(NA, 
-6L)), SiO2 = structure(list(Determination_No = 1:6, `2` = c(7.63, 
7.65, 7.73, 7.67, 7.67, 7.67), `3` = c(7.84, 7.69, 7.59, 7.77, 
7.74, 7.64), `4` = c(7.67, 7.74, 7.62, 7.81, 7.66, 7.8), `5` = c(7.91, 
7.84, 7.96, 7.87, 7.84, 7.92), `7` = c(7.77, 7.83, 7.76, 7.78, 
7.65, 7.74), `8` = c(7.936, 7.685, 7.863, 7.838, 7.828, 7.767
), `10` = c(7.872684992, 7.851291827, 7.872684992, 7.722932832, 
7.680146501, 7.615967003), `12` = c(7.64, 7.71, 7.71, 7.65, 7.82, 
7.68)), class = "data.frame", row.names = c(NA, -6L)), Al2O3 = structure(list(
    Determination_No = 1:6, `2` = c(2.01, 2.02, 2.03, 2.01, 2.02, 
    2), `3` = c(2.01, 2.01, 2, 2.02, 2.02, 2.03), `4` = c(2, 
    2.03, 1.99, 2.01, 2.01, 2.01), `5` = c(2.02, 2.02, 2.05, 
    2.03, 2.02, 2.03), `7` = c(1.88, 1.9, 1.89, 1.88, 1.88, 1.87
    ), `8` = c(2.053, 2.044, 2.041, 2.038, 2.008, 2.02), `10` = c(2.002830415, 
    2.021725042, 2.021725042, 1.983935789, 2.002830415, 2.021725042
    ), `12` = c(2.09, 2.05, 1.96, 2.09, 2.06, 2.02)), class = "data.frame", row.names = c(NA, 
-6L)))

我试过以下


colnames(l1[-1]) <- lapply(l1[-1],paste0("Lab-",colnames(l1[-1])))

colnames(l1[-1]) <- Map(paste("Lab",colnames(l1[-1]),sep=" "),l1[-1])

无论哪种解决方案,我都会收到以下错误消息

获取错误(as.character(FUN),模式=“功能”,环境=环境):找不到模式“功能”的对象“实验室-”

不知道是什么问题

谢谢

标签: rdataframelapply

解决方案


tidyverse中,我们可以使用imapwith rename_with

library(dplyr)
library(purrr)

imap(l1, ~.x %>% 
  rename_with(function(x) c(paste(.y, x[1], sep = '_'), paste0('lab_', x[-1]))))

#$Fe
#  Fe_Determination_No lab_2 lab_3 lab_4 lab_5 lab_7  lab_8 lab_10 lab_12
#1                   1 55.94 56.83 56.39 56.32 56.48 56.382   56.3  56.11
#2                   2 55.70 56.54 56.43 56.29 56.40 56.258   56.5  56.46
#3                   3 56.59 56.18 56.53 56.31 56.54 56.442   56.2  56.10
#4                   4 56.50 56.50 56.31 56.32 56.43 56.258   56.5  56.35
#5                   5 55.98 56.51 56.47 56.39 56.73 56.532   56.7  56.36
#6                   6 55.93 56.34 56.35 56.32 56.62 56.264   56.5  56.37

3$SiO2
#  SiO2_Determination_No lab_2 lab_3 lab_4 lab_5 lab_7 lab_8   lab_10 lab_12
#1                     1  7.63  7.84  7.67  7.91  7.77 7.936 7.872685   7.64
#2                     2  7.65  7.69  7.74  7.84  7.83 7.685 7.851292   7.71
#3                     3  7.73  7.59  7.62  7.96  7.76 7.863 7.872685   7.71
#4                     4  7.67  7.77  7.81  7.87  7.78 7.838 7.722933   7.65
#5                     5  7.67  7.74  7.66  7.84  7.65 7.828 7.680147   7.82
#6                     6  7.67  7.64  7.80  7.92  7.74 7.767 7.615967   7.68

#$Al2O3
#  Al2O3_Determination_No lab_2 lab_3 lab_4 lab_5 lab_7 lab_8   lab_10 lab_12
#1                      1  2.01  2.01  2.00  2.02  1.88 2.053 2.002830   2.09
#2                      2  2.02  2.01  2.03  2.02  1.90 2.044 2.021725   2.05
#3                      3  2.03  2.00  1.99  2.05  1.89 2.041 2.021725   1.96
#4                      4  2.01  2.02  2.01  2.03  1.88 2.038 1.983936   2.09
#5                      5  2.02  2.02  2.01  2.02  1.88 2.008 2.002830   2.06
#6                      6  2.00  2.03  2.01  2.03  1.87 2.020 2.021725   2.02 

或在基数 R 中Map

Map(function(x, y) {
  names(x) <- c(paste(y, names(x)[1], sep = '_'), paste0('lab_', names(x[-1])))
  x
}, l1, names(l1))

推荐阅读