在列表中重命名Data.frame的列

Rya*_*win 5 r lapply dataframe

我试图使用lapply(并希望lapply的解决方案)重命名列表中的data.frame的列,但它返回名称,而不是重命名的data.frames:

# 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)
Run Code Online (Sandbox Code Playgroud)

但是,这会返回:

[[1]]
[1] "u_n"

[[2]]
[1] "r_l"
Run Code Online (Sandbox Code Playgroud)

如果我使用与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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可能需要在命名后返回对象.

 li_2 <- lapply(seq_along(li), function(i) {
               colnames(li[[i]]) <- names(li)[i]
               li[[i]]})
Run Code Online (Sandbox Code Playgroud)

或者这可以用 setNames

 li_2 <- lapply(names(li), function(x) setNames(li[[x]], x) )
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用Map,这是一个包装mapply(这是一个多变量版本sapply).我们应用FUN每个输入的相应元素.

 li_2 <- Map(setNames, li, names(li))
Run Code Online (Sandbox Code Playgroud)

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

 Map(function(x,y) setNames(x,y), li, names(li))
Run Code Online (Sandbox Code Playgroud)

  • 这是惊人的反馈@akrun!我很欣赏所有的解决方案,它真的帮助我学习语言. (2认同)