我的列表格式为:
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))
我是在正确的轨道上还是这是一个死胡同?
答案 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