如何根据父列表名称重命名列表中的列

时间:2021-05-25 17:33:01

标签: r

我的列表格式为:

FilteredFeatures = FilteredTail

我想使用列表中父名称的名称重命名第二列。例如:

df1 <- data.frame(A = 1, B = 2, C = 3)
df2 <- data.frame(X = 1, Y = 2, Z = 3)
dfList <- list(df1,df2)
names <- c("T","U")
names(dfList) <- names
dfList
$T
  A B C
1 1 2 3

$U
  X Y Z
1 1 2 3

我尝试使用 lapply 如下:

[[1]]
  A T C
1 1 2 3

[[2]]
  X U Z
1 1 2 3

产生:

dfList1 <- lapply(dfList, function(x) setNames(dfList[[x]],x))

我也试过

[[1]]
  T NA NA
1 1 2 3

[[2]]
  U NA NA
1 1 2 3

正确重命名第二列,但删除其他列:

dfList1 <- lapply(dfList, function(x) setNames(dfList[[x]][2],x))

我是在正确的轨道上还是这是一个死胡同?

2 个答案:

答案 0 :(得分:3)

我们可以使用Map

unname(Map(function(x, y) {names(x)[2] <- y; x}, dfList, names))

-输出

#[[1]]
#  A T C
#1 1 2 3

#[[2]]
#  X U Z
#1 1 2 3

或者使用 imap 中的 purrr

library(purrr)
library(dplyr)
imap(dfList, ~ {nm1 <- .y
             .x  %>% 
               rename_with(~ nm1, 2)})

答案 1 :(得分:2)

与上面没有什么不同,但是这里使用了 baseR 的 setNames

  • 列表的名称(即向量中收集的每个列表元素的列名说 nm
  • nm 的第二个元素更改为列表名称(imap_* 中的 .y 参数)
  • 使用 nm 根据 setNames 更改列表 (.x) 的所有项目的列名
purrr::imap(dfList, ~ {nm <- names(.x)
 nm[2] <- .y
  setNames(.x, nm)})

$T
  A T C
1 1 2 3

$U
  X U Z
1 1 2 3
相关问题