转换数据框以包含值的计数

时间:2017-10-11 01:06:20

标签: r

创建了一个包含id和stringvalues的数据框:

mycols <- c('id','2')
ids <- c(1,1,2,3)
stringvalues <- c('a','a','b','c')
mydf <- data.frame(ids , stringvalues)

mydf包含:

  ids stringvalues
1   1            a
2   1            a
3   2            b
4   3            c

我正在尝试生成一个包含id和的新数据框 每个字符串的相应计数:

id, a , b , c
1 , 2 , 0 , 0
2 , 0 , 1 , 0
3 , 0 , 0 , 1

我正在尝试创建多个摘要实现:

g1 <- group_by(mydf , ids)  
s1 <- summarise(g1 , a = count('a')) 
s2 <- summarise(g1 , b = count('b')) 
s3 <- summarise(g1 , c = count('c')) 

但返回错误:Evaluation error: no applicable method for 'groups' applied to an object of class "character".

如何创建计算列中字符串条目数的新列?

3 个答案:

答案 0 :(得分:2)

执行dplyr::count后跟tidyr::spread是否适合您? (我只是在你提到你想要创建这种数据框时发布这个 - 否则使用table(mydf)就像其他评论/答案所表明的那样简单。)

library(dplyr)
library(tidyr)

mydf %>% count(ids, stringvalues) %>% spread(stringvalues, n, fill = 0)

#> # A tibble: 3 x 4
#>     ids     a     b     c
#> * <dbl> <dbl> <dbl> <dbl>
#> 1     1     2     0     0
#> 2     2     0     1     0
#> 3     3     0     0     1

答案 1 :(得分:0)

这是一个基础R解决方案:

data.frame(cbind(table(mydf)))

输出选项1(行#= ID):

  a b c
1 2 0 0
2 0 1 0
3 0 0 1

输出选项2(ID为列):

data.frame(cbind(id=unique(mydf$ids),table(mydf)))

  id a b c
1  1 2 0 0
2  2 0 1 0
3  3 0 0 1

答案 2 :(得分:0)

您可以直接使用count。首先,

count(mydf, ids,stringvalues)

给出

 # A tibble: 3 x 3
 ids stringvalues     n
 <dbl>       <fctr> <int>
1     1            a     2
2     2            b     1
3     3            c     1

然后重塑,

count(mydf, ids,stringvalues) %>% tidyr::spread(stringvalues, n)

给出

# A tibble: 3 x 4
    ids     a     b     c
* <dbl> <int> <int> <int>
1     1     2    NA    NA
2     2    NA     1    NA
3     3    NA    NA     1

然后用res[is.na(res)] <- 0之类的内容替换NAs,其中res是上面构造的对象。