在一个数据框列表中,为每个数据框的每个列名添加前缀,使用R语言。

3

我想给数据框列表中的每个数据框中除第一列外的每一列添加前缀。 我一直在尝试使用对单个数据框适用的方法,并尝试使用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])

无论使用哪种解决方案,我都会收到以下错误信息:

在执行get(as.character(FUN), mode = "function", envir = envir)时出现错误: 对象 'Lab-' 的模式为 'function' 未找到

不确定出了什么问题

谢谢

1个回答

2
tidyverse中,我们可以使用imaprename_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))

亲爱的Ronak Shah,非常抱歉打扰您。我想问一下,如果我想重命名除第一个以外的所有列,为什么这段代码会返回错误呢?我实在找不出问题所在: l1 %>% map(~ .x %>% rename_with(~ str_c("Lab", names(.x)[-1], sep = "_"), -c(1))) 。非常感谢您提前的帮助。 - Anoushiravan R
@Ronak Shah。出于好奇,为什么我的解决方案对除第一列以外的所有列都不起作用? - Spooked
1
@AnoushiravanR 在 rename_with 中不需要使用 names。可以尝试使用 l1 %>% map(~ .x %>% rename_with(~str_c("Lab", ., sep = "_"), -1)) - Ronak Shah
@Spooked 在列表上不能执行 colnames(l1[-1]) <- .... 操作,这只能在数据框上运行。 - Ronak Shah
@RonakShah 非常感谢你。我真的无法表达我的感激之情。这是一个微妙的观点。 - Anoushiravan R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接