the*_*ist 3 r rename list lapply dataframe
此问题是R中数据框列表中更改列名的扩展.
该帖子解决了更改data.frame 的所有列的名称的问题.
但是,如何更改选定数量的列的名称?
例:
我想仅在列表中的每个data.frame中更改第一列的名称:
dat <- data.frame(Foo = 1:5,Bar = 1:5)
lst <- list(dat,dat)
print(lst)
[[1]]
Foo Bar
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
[[2]]
Foo Bar
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
Run Code Online (Sandbox Code Playgroud)
(失败)尝试:
lapply(1:2, function(x) names(lst[[x]])[names(lst[[x]]) == 'Foo'] <- 'New')
lapply(1:2, function(x) names(lst[[x]])[names(lst[[x]]) == 'Foo']) <- rep('New',2)
lapply(1:2, function(x) setNames(lst[[x]][names(lst[[x]]) == 'Foo'],'New'))
Run Code Online (Sandbox Code Playgroud)
这是使用setNames和的一种可能性gsub:
# Sample data
dat <- data.frame(Foo = 1:5,Bar = 1:5)
lst <- list(dat,dat[, 2:1])
# Replace Foo with FooFoo
lst <- lapply(lst, function(x) setNames(x, gsub("^Foo$", "FooFoo", names(x))) )
#[[1]]
# FooFoo Bar
#1 1 1
#2 2 2
#3 3 3
#4 4 4
#5 5 5
#
#[[2]]
# Bar FooFoo
#1 1 1
#2 2 2
#3 3 3
#4 4 4
#5 5 5
Run Code Online (Sandbox Code Playgroud)
你的尝试有两个问题:
使用lapply(1:2, ...)而不是lapply(lst, ...). 这使您的匿名函数更加笨拙。
您的匿名函数没有return数据框。返回函数的最后一行(在没有return()语句的情况下)。在您的第一次尝试中,最后一行的值只是分配的值,"new"我们需要使用修改后的名称返回整个数据框。
解决方案:
lapply(lst, function(x) {names(x)[names(x) == 'Foo'] <- 'New'; x})
# [[1]]
# New Bar
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
#
# [[2]]
# New Bar
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |