我需要一种有效的方法将多个数据帧的列名转换为小写。
假设我们有:
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()的解决方案。
有没有修改大量数据框的列名而没有太多编码的建议?
答案 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
通常不鼓励这种get
和assign
例行程序。最好将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