在 for 循环中为列名添加编号前缀
Adding a numbered prefix to column names in a for loop
我有 50 个数据框,它们都具有相同的列名(例如 df1:colnames = Id、A、B、C、D、df2:colnames = ID、A、B、C、D 等等)。
我需要重命名它们,使其成为 df1: colnames = ID, Mth1_A, Mth1_B, Mth1_C, Mth1_D 然后 df2: ID, Mth2_A、Mth2_B、Mth2_C、Mth2_D。所以每个列名应该对应数据帧的编号。
我已经创建了一个函数来执行此操作;
col_prefix <- function(df, Mth){
colnames(df)[2:ncol(df)] <- paste("Mth", colnames(df)[2:ncol(df)], sep = "_")
return(df)
}
但我现在正在尝试创建一个循环来为所有 50 个执行此操作,但我无法让它工作。这是我到目前为止所得到的
dfList <- c("df1", "df2",...,"df50")
for (filename in dfList){
i <- get(filename)
i <- col_prefix(i, Mth)
}
它向数据场添加了前缀“Mth”,但没有执行“Mth1”、“Mth2”等。我很确定这是因为在我的函数中 Mth 是一个字符,但我不知道如何循环。
请帮忙!
将它们放在一个列表中,并使用它们的名称(df1、df2 等...)来捕获前缀, 即
l1 <- mget(grep(pattern = "df[0-9]+", x = ls(), value = TRUE))
Map(function(x, y) setNames(x, paste0('MTH', gsub('\D+', '', y), '_', names(x))),
l1, names(l1))
$df1
MTH1_v1 MTH1_v2
1 5 9
2 6 10
3 7 11
$df2
MTH2_v1 MTH2_v2
1 15 19
2 16 110
3 17 111
要更改除第一个以外的所有名称,
Map(function(x, y) data.frame(x[1], setNames(x[-1], paste0('MTH', gsub('\D+', '', y), '_', names(x)[-1]))), l1, names(l1))
$df1
v1 MTH1_v2
1 5 9
2 6 10
3 7 11
$df2
v1 MTH2_v2
1 15 19
2 16 110
3 17 111
数据
dput(df1)
structure(list(v1 = c(5, 6, 7), v2 = c(9, 10, 11)), class = "data.frame", row.names = c(NA,
-3L))
dput(df2)
structure(list(v1 = c(15, 16, 17), v2 = c(19, 110, 111)), class = "data.frame", row.names = c(NA,
-3L))
我有 50 个数据框,它们都具有相同的列名(例如 df1:colnames = Id、A、B、C、D、df2:colnames = ID、A、B、C、D 等等)。
我需要重命名它们,使其成为 df1: colnames = ID, Mth1_A, Mth1_B, Mth1_C, Mth1_D 然后 df2: ID, Mth2_A、Mth2_B、Mth2_C、Mth2_D。所以每个列名应该对应数据帧的编号。
我已经创建了一个函数来执行此操作;
col_prefix <- function(df, Mth){
colnames(df)[2:ncol(df)] <- paste("Mth", colnames(df)[2:ncol(df)], sep = "_")
return(df)
}
但我现在正在尝试创建一个循环来为所有 50 个执行此操作,但我无法让它工作。这是我到目前为止所得到的
dfList <- c("df1", "df2",...,"df50")
for (filename in dfList){
i <- get(filename)
i <- col_prefix(i, Mth)
}
它向数据场添加了前缀“Mth”,但没有执行“Mth1”、“Mth2”等。我很确定这是因为在我的函数中 Mth 是一个字符,但我不知道如何循环。
请帮忙!
将它们放在一个列表中,并使用它们的名称(df1、df2 等...)来捕获前缀, 即
l1 <- mget(grep(pattern = "df[0-9]+", x = ls(), value = TRUE))
Map(function(x, y) setNames(x, paste0('MTH', gsub('\D+', '', y), '_', names(x))),
l1, names(l1))
$df1
MTH1_v1 MTH1_v2
1 5 9
2 6 10
3 7 11
$df2
MTH2_v1 MTH2_v2
1 15 19
2 16 110
3 17 111
要更改除第一个以外的所有名称,
Map(function(x, y) data.frame(x[1], setNames(x[-1], paste0('MTH', gsub('\D+', '', y), '_', names(x)[-1]))), l1, names(l1))
$df1
v1 MTH1_v2
1 5 9
2 6 10
3 7 11
$df2
v1 MTH2_v2
1 15 19
2 16 110
3 17 111
数据
dput(df1)
structure(list(v1 = c(5, 6, 7), v2 = c(9, 10, 11)), class = "data.frame", row.names = c(NA,
-3L))
dput(df2)
structure(list(v1 = c(15, 16, 17), v2 = c(19, 110, 111)), class = "data.frame", row.names = c(NA,
-3L))