如何保存*应用函数族对数据所做的修改

时间:2016-03-30 11:55:57

标签: r dataframe lapply

我有data.frames列表。

> LoDFs <- list(data.frame(y1=c(1,2,3), y2=c(4,5,6)), data.frame(yA=c(1,2,3), yB=c(4,5,6)))

> LoDFs
[[1]]
  y1 y2
1  1  4
2  2  5
3  3  6

[[2]]
  yA yB
1  1  4
2  2  5
3  3  6

Here我发现如何使用lapply函数分别操作每个data.frame。我的目标是更改特定data.frame中的列名称(两个data.frames应该有第一列名为A和第二列B)。我试过以下:

> col.names <- c("A", "B")
> lapply(seq_along(LoDFs), function(x) {colnames(LoDFs[[x]]) <- col.names})
[[1]]
[1] "A" "B"

[[2]]
[1] "A" "B"

但它只返回修改并且不影响特定的data.frame:

> LoDFs
[[1]]
  y1 y2
1  1  4
2  2  5
3  3  6

[[2]]
  yA yB
1  1  4
2  2  5
3  3  6

如何保存*应用函数族对数据所做的修改?

2 个答案:

答案 0 :(得分:1)

lapply(LoDFs, 'names<-', c("A", "B"))
[[1]]
  A B
1 1 4
2 2 5
3 3 6

[[2]]
  A B
1 1 4
2 2 5
3 3 6

答案 1 :(得分:1)

另一个选项是setNames

lapply(LoDFs, setNames, c('A', 'B'))
# [[1]]
#  A B
#1 1 4
#2 2 5
#3 3 6

#[[2]]
#  A B
#1 1 4
#2 2 5
#3 3 6

如果我们需要进行适当修改,我们可以使用%<>%中的magrittr运算符。

library(magrittr)
LoDFs %<>% 
      lapply(., setNames, c("A", "B"))
sapply(LoDFs, names)
#    [,1] [,2]
#[1,] "A"  "A" 
#[2,] "B"  "B"