更改数据框列表中的列名

时间:2017-10-04 11:30:47

标签: r dataframe lapply

我有一个数据框列表,我想在其中更改列表中每个数据框中第二列的名称,以便它与保存它的列表项的名称相匹配。我目前的代码是:

my_list <- list(one = data.frame(a <- 1:5, b <- 1:5), two = data.frame(a <- 1:5, b <- 1:5))
my_list <- lapply(seq_along(names(my_list)), function(x) names(my_list[[x]])[2] <- names(my_list)[x])

但是我的代码只是在没有理解原因的情况下替换数据帧。任何帮助将不胜感激。

我知道我可以轻松地使用&#34; for&#34;循环,但我想避免它,因此我的问题。

3 个答案:

答案 0 :(得分:3)

setNames在这里很方便:

my_list2 <- lapply(
  names(my_list), 
  function(x) setNames(my_list[[x]], c(names(my_list[[x]])[1], x))
)

或使用Map(我认为更容易阅读):

my_list2 <- Map(
  function(x, n) setNames(x, c(names(x)[1], n)),
  my_list, names(my_list)
)
> my_list2
$one
  a one
1 1   1
2 2   2
3 3   3
4 4   4
5 5   5

$two
  a two
1 1   1
2 2   2
3 3   3
4 4   4
5 5   5

names<-的一个问题是它返回的是名称,而不是对象。

答案 1 :(得分:1)

试试这个,循环遍历data.frames,更新列名:

# dummy list
my_list <- list(one = data.frame(a = 1:5, b = 1:5), two = data.frame(a = 1:5, b = 1:5))

my_list_updated <-
  lapply(names(my_list), function(i){
  x <- my_list[[ i ]]
  # set 2nd column to a new name
  names(x)[2] <- i
  # return
  x
})

my_list_updated 
# [[1]]
#   a one
# 1 1   1
# 2 2   2
# 3 3   3
# 4 4   4
# 5 5   5
# 
# [[2]]
#   a two
# 1 1   1
# 2 2   2
# 3 3   3
# 4 4   4
# 5 5   5

答案 2 :(得分:0)

您可以使用超级赋值运算符:

my_list <- list(one = data.frame(a = 1:5, b = 1:5), two = data.frame(a = 1:5, b = 1:5))
lapply(seq_along(names(my_list)), function(x) names(my_list[[x]])[2] <<- names(my_list)[x] )
my_list