我有一个数据框列表,我想在其中更改列表中每个数据框中第二列的名称,以便它与保存它的列表项的名称相匹配。我目前的代码是:
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])
但是我的代码只是在没有理解原因的情况下替换数据帧。任何帮助将不胜感激。
我知道我可以轻松地使用&#34; for&#34;循环,但我想避免它,因此我的问题。
答案 0 :(得分: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
names<-
的一个问题是它返回的是名称,而不是对象。
答案 1 :(得分:1)
试试这个,循环遍历data.frames,更新列名:
# 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
答案 2 :(得分: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