更改数据框列表中的列名

3

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

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])

但是我的代码只是替换了数据框,而我并不理解为什么会这样。非常感谢您的帮助。

我知道可以使用“for”循环来轻松实现此操作,但我想避免使用它,因此提出了这个问题。


你的data.frames里面是在进行类似本示例中给变量赋值的操作吗?如果是的话,只需要用=替换<-即可。你想要修改成什么名字呢? - Roman Luštrik
1
也许你需要使用 library(data.table); rbindlist(my_list, idcol = "myDataFrameID") - zx8754
dplyr::bind_rows(my_list, .id = "myDataFrameID") - Axeman
3个回答

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
< p > names<- 的一个问题是它返回的是名称,而不是对象本身。


2
我不会把那称为问题,而是一个特性。 :) - Roman Luštrik
当然可以!只是在应用族群中偶尔会出现一些令人惊讶的情况。 - Axeman

1

尝试这个,循环遍历数据框,更新列名:

# 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

谢谢,我已经接受了你的答案。它以简单的方式实现了我想要的功能。虽然我仍然不明白为什么我的代码不能做到这一点。 - stratar

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

1
你可以这样做!但是很多人会避免这样做,因为它可能导致意想不到的后果。 - Axeman

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