如何一次性修改R语言列表中多个数据框的行名?
批量修改列表中每个data.frame的行名
示例数据
df <- data.frame(A = 1:10, B = 1:10) list1 <- list(df[1:3,],df[4:6,],df[7:10,])
原列表输出:
[[1]] A B 1 1 1 2 2 2 3 3 3 [[2]] A B 4 4 4 5 5 5 6 6 6 [[3]] A B 7 7 7 8 8 8 9 9 9 10 10 10
需求
将列表中每个data.frame的行名改为从1开始的连续数字,期望输出:
[[1]] A B 1 1 1 2 2 2 3 3 3 [[2]] A B 1 4 4 2 5 5 3 6 6 [[3]] A B 1 7 7 2 8 8 3 9 9 4 10 10
已尝试的代码
能生成目标行名,但无法应用到data.frame上:
lapply(list1,function(x){rownames(x) <- 1:dim(x)[1]})
输出结果仅为行名向量,而非修改后的data.frame:
[[1]] [1] 1 2 3 [[2]] [1] 1 2 3 [[3]] [1] 1 2 3 4
解决方案
问题出在匿名函数只修改了行名,但没有返回修改后的data.frame。只需在函数末尾返回修改后的对象即可:
方法1:生成新列表
list2 <- lapply(list1, function(x) { rownames(x) <- 1:nrow(x) # 用nrow(x)比dim(x)[1]更直观 x # 返回修改后的data.frame })
方法2:直接修改原列表
如果想直接覆盖原列表,用lapply的结果重新赋值即可:
list1 <- lapply(list1, function(x) { rownames(x) <- seq_len(nrow(x)) # seq_len(nrow(x))与1:nrow(x)效果一致 x })
运行上述代码后,查看list1或list2就能得到符合要求的行名格式。
内容的提问来源于stack exchange,提问作者theforestecologist
相关产品推荐
相关产品推荐

