跨列表中的多个数据框更改单列

时间:2019-12-25 06:22:04

标签: r lapply

这些问题:

Changing Column Names in a List of Data Frames in R

Changing names in a list of dataframes

两者都可以更改列名,但是我要更改的唯一列名是第一列。我列表中的数据框只有第一列相同。

这是我遇到的问题的可复制示例:

df1 <- data.frame(A = 1:5, B = 1:5)
df2 <- data.frame(A = 11:15, B = 21:25)
ldf <- list(df1, df2)
ldf <- lapply(ldf, setNames, "State")
L
[[1]]
  State NA
1     1  1
2     2  2
3     3  3
4     4  4
5     5  5

[[2]]
  State NA
1    11 21
2    12 22
3    13 23
4    14 24
5    15 25

我如何在lapply中指定一列,而其余部分不予处理?

2 个答案:

答案 0 :(得分:3)

我们可以像这样使用lapply

lapply(ldf, function(x) {names(x)[1] <- "State";x})

#[[1]]
#  State B
#1     1 1
#2     2 2
#3     3 3
#4     4 4
#5     5 5

#[[2]]
#  State  B
#1    11 21
#2    12 22
#3    13 23
#4    14 24
#5    15 25

答案 1 :(得分:2)

我们可以使用rename_at

library(purrr)
library(dplyr)
map(ldf, ~ .x %>%
              rename_at(1, ~ "State"))
#[[1]]
#  State B
#1     1 1
#2     2 2
#3     3 3
#4     4 4
#5     5 5

#[[2]]
#  State  B
#1    11 21
#2    12 22
#3    13 23
#4    14 24
#5    15 25

或与select

map(ldf, ~ .x %>%
             select(State = 1, everything()))

或使用setnames中的data.table

library(data.table)
lapply(ldf, setnames, old = 1, new = 'State')
ldf
#[[1]]
#  State B
#1     1 1
#2     2 2
#3     3 3
#4     4 4
#5     5 5

#[[2]]
#  State  B
#1    11 21
#2    12 22
#3    13 23
#4    14 24
#5    15 25

或使用base R

lapply(ldf, setNames, c("State", names(ldf[[1]][-1])))