【问题标题】:Constructing simple function in R with names() and lapply() to a list在 R 中使用 names() 和 lapply() 构造简单函数到列表
【发布时间】:2015-07-23 08:56:48
【问题描述】:

我正试图将我的想法更多地转向应用 lapply 或函数,而不是连续循环。在这里,我有一个在循环中运行良好的代码 - 目标很简单:为列表的每个元素中的每一列命名。我想把它转换成一个函数,但我不能让它工作。

data1 <- data.frame(rnorm(10),rnorm(10),rnorm(10))
data2 <- data.frame(rnorm(10),rnorm(10),rnorm(10))
data3 <- data.frame(rnorm(10),rnorm(10),rnorm(10))

data <- list(data1,data2,data3)



for (i in 1:length(data)) {
        names(data[[i]]) <- c("x", "y", "r")
}

这是我弄错的地方:

lapply(data, function(x) names(x) <-  c("x", "y", "f"))

而且这个功能对我也不起作用:

givenames <- function (x) {
        names(x) <-  c("x", "y", "f")
}

lapply(data,givenames)

【问题讨论】:

    标签: r list function loops lapply


    【解决方案1】:

    好主意!

    在你的功能中,你几乎就在那里。事实上你没有返回data.frame,你应该这样做:

    lapply(data, function(x) {names(x) <-  c("x", "y", "f"); x})
    

    等同于:

    lapply(data, function(x) {
        names(x) <-  c("x", "y", "f")
        x
    })
    

    这是一个简洁的解决方案:

    lapply(data, setNames, c('x','y','f'))
    

    请注意,setNames 返回的是 data.frame,这是它起作用的原因。

    【讨论】:

    • 谢谢!请问{names(x) &lt;- c("x", "y", "f"); x}代码段中需要的分号后面的x是什么?
    • lapply(data, function(x) "names&lt;-"(x,c("x", "y", "f"))) 也有效。 @Anna 在 R 中你可以在同一行写两个命令,只要你在它们之间放一个;
    • 你可以在一行上定义多个指令,用;分隔它们,我相应地编辑了我的答案。
    • @Anna 你的函数接受一个数据框,修改名称并返回一个数据框。所以你可以提到 return(x) 但要注意在 R 中,函数中的最后一个元素被返回。所以我们可以写 x。我强烈建议您阅读以下内容:adv-r.had.co.nz/Functions.html#return-values
    • 不,是lapply(data, function(x) `names&lt;-`(x,c("x", "y", "f")))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2017-09-01
    • 1970-01-01
    • 2013-02-14
    • 2015-10-12
    • 2020-11-12
    相关资源
    最近更新 更多