使用字符串中的名称修改对象

时间:2015-04-02 14:05:51

标签: r string dataframe

我需要一种有效的方法将多个数据帧的列名转换为小写。

假设我们有:

df1 <- data.frame(VAR1=c(1,2), VAR2=c("a", "b"))
df2 <- data.frame(VAR1=c(TRUE,FALSE), VAR2=c("foo", "bar"))

获得我想要的简单方法是:

names(df1) <- tolower(names(df1))
names(df2) <- tolower(names(df2))

如果你有大量的数据框,那就有点乏味了 我需要更好的东西。

我以为我可以在循环中使用get():

my.files <- ls()
for(i in 1:2) names(get(my.files[i])) <- tolower(names(get(my.files[i])))

但它不起作用。我也找不到使用lapply()的解决方案。
有没有修改大量数据框的列名而没有太多编码的建议?

1 个答案:

答案 0 :(得分:2)

这是一个使用setNames的单行程序,这是一个很好的函数,用于修改对象的“名称”属性,而不必临时创建副本。

for(i in ls(pattern = "df")) assign(i, setNames(get(i), tolower(names(get(i)))))
df1
#   var1 var2
# 1    1    a
# 2    2    b
df2
#    var1 var2
# 1  TRUE  foo
# 2 FALSE  bar

通常不鼓励这种getassign例行程序。最好将data.frames放在列表中,而不是放在.GlobalEnv中的一堆命名对象中。在您的情况下,您可以执行以下操作:

a <- list(df1 = df1, df2 = df2)
a
# $df1
#   VAR1 VAR2
# 1    1    a
# 2    2    b
# 
# $df2
#    VAR1 VAR2
# 1  TRUE  foo
# 2 FALSE  bar

lapply(a, function(x) setNames(x, tolower(names(x))))
# $df1
#   var1 var2
# 1    1    a
# 2    2    b
# 
# $df2
#    var1 var2
# 1  TRUE  foo
# 2 FALSE  bar