【问题标题】:Pasting a string of variables into a function is not working将一串变量粘贴到函数中不起作用
【发布时间】:2021-09-26 03:53:45
【问题描述】:

我在看这个问题:Find how many times duplicated rows repeat in R data frame,它提供了以下代码:

library(plyr)
ddply(df,.(a,b),nrow)

但是,我有一个包含许多变量的数据集,所以在这种情况下我不能像 a,b 那样输入它们。我尝试使用带有粘贴功能的名称(数据),但它似乎不起作用。我试过这个:

var_names=paste(names(data),collapse=",")
ddply(data,.(paste(a)),nrow)

它反而给出了这个输出:

但是,如果我手动输入它们,我会得到正确的输出:

在这里我需要做些什么不同的事情?

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    使用dplyr 中的count 代替paste 和评估,它可以采用acrossselect-helpers - everything() 的多个列

    library(dplyr)
    df %>% 
        count(across(everything()))
    

    mtcars 数据集的可重现示例

    data(mtcars)
    df <- mtcars %>% 
       select(vs:carb)
    
    count(df, across(everything()))
       vs am gear carb n
    1   0  0    3    2 4
    2   0  0    3    3 3
    3   0  0    3    4 5
    4   0  1    4    4 2
    5   0  1    5    2 1
    6   0  1    5    4 1
    7   0  1    5    6 1
    8   0  1    5    8 1
    9   1  0    3    1 3
    10  1  0    4    2 2
    11  1  0    4    4 2
    12  1  1    4    1 4
    13  1  1    4    2 2
    14  1  1    5    2 1
    

    另外,在ddply 中,我们可以只传递一个列名向量,即无需创建单个字符串

    library(plyr)
    ddply(df, names(df), nrow)
       vs am gear carb V1
    1   0  0    3    2  4
    2   0  0    3    3  3
    3   0  0    3    4  5
    4   0  1    4    4  2
    5   0  1    5    2  1
    6   0  1    5    4  1
    7   0  1    5    6  1
    8   0  1    5    8  1
    9   1  0    3    1  3
    10  1  0    4    2  2
    11  1  0    4    4  2
    12  1  1    4    1  4
    13  1  1    4    2  2
    14  1  1    5    2  1
    

    或者,如果我们要从名称中创建单个字符串,则还要 paste 整个表达式,然后是 evaluate(不建议这样做,因为有标准的处理方法)

    eval(parse(text = paste('ddply(df, .(', toString(names(df)), '), nrow)')))
       vs am gear carb V1
    1   0  0    3    2  4
    2   0  0    3    3  3
    3   0  0    3    4  5
    4   0  1    4    4  2
    5   0  1    5    2  1
    6   0  1    5    4  1
    7   0  1    5    6  1
    8   0  1    5    8  1
    9   1  0    3    1  3
    10  1  0    4    2  2
    11  1  0    4    4  2
    12  1  1    4    1  4
    13  1  1    4    2  2
    14  1  1    5    2  1
    

    【讨论】:

      【解决方案2】:

      您可以通过将所有列分组并计算其长度来使用aggregate

      aggregate(1:nrow(df)~., df, length)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2020-01-07
        • 2014-03-18
        • 1970-01-01
        相关资源
        最近更新 更多