首页 > 解决方案 > 将一串变量粘贴到函数中不起作用

问题描述

我在看这个问题: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)

相反,它给出了这个输出:

在此处输入图像描述

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

在此处输入图像描述

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

标签: rdataframeplyr

解决方案


代替paste和评估,使用countfrom dplyr,它可以使用多列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整个表达式,然后eval是 uate(不建议这样做,因为有标准的处理方法)

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

推荐阅读