在列表中操作数据框:重命名变量

3

定义:

dats <- list( df1 = data.frame(A=sample(1:3), B = sample(11:13)),
        df2 = data.frame(AA=sample(1:3), BB = sample(11:13)))

s.t.

> dats
$df1
  A  B
1 2 12
2 3 11
3 1 13

$df2
  AA BB
1  1 13
2  2 12
3  3 11

我想将所有变量名从大写改为小写。我可以使用循环来实现,但是无论如何都无法使这个lapply调用起作用:

dats <- lapply(dats, function(x) 
            names(x)<-tolower(names(x)))

这导致:
> dats
$df1
[1] "a" "b"

$df2
[1] "aa" "bb"

期望的结果是:

> dats
$df1
  a  b
1 2 12
2 3 11
3 1 13

$df2
  aa bb
1  1 13
2  2 12
3  3 11
1个回答

3

如果在函数结尾没有使用 return,则最后一个被计算的表达式会被返回。因此你需要返回 x

dats <- lapply(dats, function(x) {
            names(x)<-tolower(names(x))
            x})

非常感谢。我错过了大括号,但为什么需要返回 x 呢?“如果您在函数结尾处不使用‘return’,则将返回最后一个计算的表达式”很难理解。 - Fred
在你的例子中,大括号是不必要的;我不得不添加它们,因为我有多于一行的代码。你函数中的“最后一个计算表达式”是 names(x) <- tolower(names(x))。该赋值语句的结果分别是 "a" "b""aa" "bb",所以这就是函数返回的内容。例如,尝试 (names(x) <- tolower(names(x))) - Joshua Ulrich
好的,我查看了帮助文件(?function不起作用,?'function'可以),现在明白了。这个例子很清晰:function(x,y){ z <- x^2 + y^2; return(x+y+z) }:返回值与表达式中计算的值不同,这使得更加自由。对于我的情况,期望的返回值是数据框而不是向量names(x) - Fred
很高兴你能理解,尽管我表达不够清晰。而且你不必明确使用return关键字。function(x,y){ z <- x^2 + y^2; x+y+z }可以达到同样的效果。顺便说一下,?function无法工作,因为function是一个保留字。 - Joshua Ulrich
谢谢,我添加了 return 以使像我这样的新手更加明确。该示例来自帮助页面。 - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接