在列表中重命名数据框的列

7

我正在尝试使用lapply(并且希望使用lapply解决方案)来重命名位于列表中的数据框的列,但它返回的是列名,而不是重命名后的数据框:

# define list
li <- list(u_n = data.frame(x = 1:3), r_l = data.frame(y = 4:6))

# trying to rename columns after the element of the list they're located in
li_2 <- lapply(1:length(li),
                function(x,y) colnames(y[[x]]) <- names(y)[x], y = li)

然而,这将返回:
[[1]]
[1] "u_n"

[[2]]
[1] "r_l"

如果我单独使用lapply函数指定的相同方法,它确实起作用:
li[1]
$u_n
  x
1 1
2 2
3 3

colnames(li[[1]]) <- names(li)[1]

li[1]
$u_n
  u_n
1   1
2   2
3   3
1个回答

11

命名后可能需要返回该对象。

 li_2 <- lapply(seq_along(li), function(i) {
               colnames(li[[i]]) <- names(li)[i]
               li[[i]]})

或者可以使用setNames函数来完成这个操作

 li_2 <- lapply(names(li), function(x) setNames(li[[x]], x) )

或者我们可以使用Map,它是mapplysapply的多元版本)的包装器。我们将FUN应用于每个输入的相应元素。

 li_2 <- Map(setNames, li, names(li))

在这里,我们将每个list元素的列名更改为相应的list元素的名称。如果使用匿名函数,它将是

 Map(function(x,y) setNames(x,y), li, names(li))

2
这是惊人的反馈@akrun!我感谢所有的解决方案,它真的帮助我学习语言。 - Ryan Erwin
@RyanErwin 很高兴知道它有所帮助。感谢您的回复。 - akrun

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