更改R中数据框列表中的列名称子集

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)

Mau*_*ers 6

这是使用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)

  • 要迂腐和保守,你可能想要将正则表达式模式更改为"^ ^ Foo $"或使用`replace`而不是`gsub`.当我只是想让它匹配整个字符串时,我确实被一个字符串的模式匹配所困扰. (2认同)

Gre*_*gor 5

你的尝试有两个问题:

  1. 使用lapply(1:2, ...)而不是lapply(lst, ...). 这使您的匿名函数更加笨拙。

  2. 您的匿名函数没有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)