【问题标题】:Set column names while calling a function调用函数时设置列名
【发布时间】:2014-01-04 09:07:36
【问题描述】:

假设我们有一个数字 data.frame foo 并希望找到每两列的总和:

foo <- data.frame(x=1:5,y=4:8,z=10:14, w=8:4)
bar <- combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]])
bar
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    5   11    9   14   12   18
#[2,]    7   13    9   16   12   18
#[3,]    9   15    9   18   12   18
#[4,]   11   17    9   20   12   18
#[5,]   13   19    9   22   12   18

一切都很好,除了bar 中缺少的列名。我希望bar 的列名显示foo 中的相关列,例如在此示例中:

colnames(bar) <- apply(combn(colnames(foo),2), 2, paste0,collapse="")
colnames(bar)
#[1] "xy" "xz" "xw" "yz" "yw" "zw"

这很简单,但我想在同一 bar &lt;- combn(...) 命令中执行列标签。到底有没有?

【问题讨论】:

    标签: r function dataframe apply combn


    【解决方案1】:

    这是可能的,但它会混淆您的代码。简洁性和清晰性之间的权衡非常重要。

    为了了解它的工作原理,我参考了this question

    colnames(x) <- y
    

    内部重写为

    x <- `colnames<-`(x,y)
    

    然后您可以自己进行翻译。

    bar <- `colnames<-`(combn(colnames(foo), 2, function(x) foo[,x[1]] + foo[,x[2]]),
                        apply(combn(colnames(foo),2), 2, paste0,collapse=""))
    

    但是,在许多情况下,以这种方式折叠代码行所需的心理和句法体操是不值得的。多行往往更容易理解。

    【讨论】:

    • +1 用于使用多行。简明扼要,代码是供您阅读的,而不是计算机。
    • 有趣的答案。无论如何将列名分配给function(x) 结果?如果是这样,我们可能会跳过apply(...) 函数。根据@RomanLuštrik 的回答,我知道它在combn() 函数中不起作用,但它可能在其他地方有用。
    【解决方案2】:

    您从 data.frame 开始,而不是矩阵。没那么重要,但它有助于跟上我们通常使用的行话。

    你所追求的是不可能的。如果你看combn的代码,当结果被简化时,它没有使用维度名称。

        }
        if (simplify) 
            array(out, dim.use)
        else out
    }
    

    您可以破解该函数并使其添加维度名称,或者您可以手动将其添加到结果中post festum

    【讨论】:

    • 谢谢,我将矩阵更改为 OP 中的 data.frame
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多