如何对r中的所有列进行计数和dcast

时间:2018-06-14 12:55:47

标签: r

我在r

中有以下数据框
     Company     Education    Health      
        A           NA          1              
        A           1           2             
        A           1           NA            

我希望以下列格式计算每列(1,2,NA)中的级别

     Company     Education_1   Education_NA   Health_1    Health_2    Health_NA
       A            2             1             1            1            1 

我怎样才能在R?

中完成

3 个答案:

答案 0 :(得分:6)

您可以执行以下操作:

library(tidyverse)
df %>%
    gather(k, v, -Company) %>%
    unite(tmp, k, v, sep = "_") %>%
    count(Company, tmp) %>%
    spread(tmp, n)
## A tibble: 1 x 6
#  Company Education_1 Education_NA Health_1 Health_2 Health_NA
#  <fct>         <int>        <int>    <int>    <int>     <int>
#1 A                 2            1        1        1         1

样本数据

df <- read.table(text =
    "     Company     Education    Health
        A           NA          1
        A           1           2
        A           1           NA         ", header = T)

答案 1 :(得分:2)

在我们添加公司B的末尾的注释中使用DF并使用reshape2包,可以在一次重新调用中完成。可以省略id.varfun参数,并给出相同的答案,但会产生一条消息,说明它使用了这些默认值。

library(reshape2)

recast(DF, Company ~ variable + value, 
  id.var = "Company", fun = length)

给出这个数据框:

  Company Education_1 Education_NA Health_1 Health_2 Health_NA
1       A           2            1        1        1         1
2       B           2            1        1        1         1

注意

Lines <- "  Company Education Health
1       A        NA      1
2       A         1      2
3       A         1     NA
4       B        NA      1
5       B         1      2
6       B         1     NA"
DF <- read.table(text = Lines)

答案 2 :(得分:1)

plyr中,您可以通过转置表来使用ddply的hack来获取看似新列的内容:

x <- data.frame(Company="A",Education=c(NA,1,1),Health=c(1,2,NA))

library(plyr)
ddply(x,.(Company),plyr::summarise,
                       Education=t(table(addNA(Education))),
                       Health=t(table(addNA(Health)))
)
  Company Education.1 Education.NA Health.1 Health.2 Health.NA
1       A           2            1        1        1         1

但是,它们不是真正的列,而是data.frame中的表元素。

您可以使用do.call(data.frame,y)构造使它们成为正确的数据框列,但您需要多行才能生效。