R按条件计算出现次数,并将其放入新的数据帧中

R按条件计算出现次数,并将其放入新的数据帧中,r,dataframe,R,Dataframe,我有一个非常复杂的数据框,其中包含了可能的变量,因此我创建了一个简化的数据框,用于解决这个问题: sample deployment density replicate shell.num A A L 1 1 A A L 1 1 A A L 1

我有一个非常复杂的数据框,其中包含了可能的变量,因此我创建了一个简化的数据框,用于解决这个问题:

sample  deployment  density replicate   shell.num   
  A       A           L         1          1         
  A       A           L         1          1         
  A       A           L         1          2         
  A       A           L         2          1         
  A       A           L         2          2         
  B       B           L         1          1         
  B       B           L         1          2         
  B       B           L         2          1         
  B       B           L         2          2         
  A       C           M         1          2        
  A       C           M         1          2       
  A       C           M         1          3        
  A       C           M         2          1         
  A       C           M         2          1         
我要做的是生成与每个变量匹配的行数计数,然后将该计数导出到新的数据帧。我希望新的数据框与此数据框的结构相匹配,以便列出所有变量。例如:对于sample=A、deployment=A、density=L、replicate=1、shell.num=1,使用该分类导出的计数应为2

新表基本上如下所示:

sample  deployment  density replicate   shell.num   count
  A         A          L        1            1        2
  A         A          L        1            2        1
  A         A          L        2            1        1
  A         A          L        2            2        1
  B         B          L        1            1        1
等等


我知道有一些简单的函数,比如
nrow()
,但我不想对每个可能的变量组合都这样做。在我的真实数据框架中,我需要处理数千行数据,这将无法达到目的。是否有更简单的方法将其组织到新的数据框中,以便将其导出为csv

这里有一个简单的
tidyverse
解决方案。基本上,您要做的是在感兴趣的变量上使用
group\u by
,然后使用
summary(n())
来获得每个组中的计数。这里的
count
函数只是此操作的包装器

库(tidyverse)
待定%
计数(示例、部署、密度、复制、shell.num)
#>#A tibble:11 x 6
#>示例部署密度复制shell.num n
#>                         
#>1 A L 11 2
#>2 A L 1 2 1
#>3 A L 2 1 1
#>4 A L 2 1
#>5 A C M 1 2 2
#>6 A C M 1 3 1
#>7 A C M 2 1 2
#>8BL11
#>9 B L 1 2 1
#>10BL211
#>11 B L 2 1

由(v0.2.0)于2018年2月26日创建。

这里是一个简单的
tidyverse
解决方案。基本上,您要做的是在感兴趣的变量上使用
group\u by
,然后使用
summary(n())
来获得每个组中的计数。这里的
count
函数只是此操作的包装器

库(tidyverse)
待定%
计数(示例、部署、密度、复制、shell.num)
#>#A tibble:11 x 6
#>示例部署密度复制shell.num n
#>                         
#>1 A L 11 2
#>2 A L 1 2 1
#>3 A L 2 1 1
#>4 A L 2 1
#>5 A C M 1 2 2
#>6 A C M 1 3 1
#>7 A C M 2 1 2
#>8BL11
#>9 B L 1 2 1
#>10BL211
#>11 B L 2 1

由(v0.2.0)于2018年2月26日创建。

这是使用
表和
复制的
以R为基础的解决方案:

row <- apply(df, 1, paste0, collapse = "_");
df2 <- cbind.data.frame(
    df[!duplicated(row), ],
    count = as.numeric(table(row)));
df2;
#   sample deployment density replicate shell.num count
#1       A          A       L         1         1     2
#3       A          A       L         1         2     1
#4       A          A       L         2         1     1
#5       A          A       L         2         2     1
#6       B          B       L         1         1     2
#7       B          B       L         1         2     1
#8       B          B       L         2         1     2
#9       B          B       L         2         2     1
#10      A          C       M         1         2     1
#12      A          C       M         1         3     1
#13      A          C       M         2         1     1

行这里是使用
表和
复制的
在基R中的解决方案:

row <- apply(df, 1, paste0, collapse = "_");
df2 <- cbind.data.frame(
    df[!duplicated(row), ],
    count = as.numeric(table(row)));
df2;
#   sample deployment density replicate shell.num count
#1       A          A       L         1         1     2
#3       A          A       L         1         2     1
#4       A          A       L         2         1     1
#5       A          A       L         2         2     1
#6       B          B       L         1         1     2
#7       B          B       L         1         2     1
#8       B          B       L         2         1     2
#9       B          B       L         2         2     1
#10      A          C       M         1         2     1
#12      A          C       M         1         3     1
#13      A          C       M         2         1     1

row好的,我看到输出是我想要的,但我不确定您是如何构造代码来完成所有工作的。group by工作正常,但我无法生成计数输出。对不起,我对这门语言还不太熟悉。哪一部分让人困惑?这里,
count
只是
dplyr
包中内置的一个速记
tbl%>%groupby(var1,var2)%%>%summary(n())%%>%ungroup()
tbl%>%count(var1,var2)
相同,我知道输出是我想要的,但我不确定您是如何构造代码来完成所有工作的。group by工作正常,但我无法生成计数输出。对不起,我对这门语言还不太熟悉。哪一部分让人困惑?这里,
count
只是
dplyr
包中内置的一个速记<代码>tbl%>%分组依据(var1,var2)%>%总结(n())%>%ungroup()
tbl%>%计数(var1,var2)