创建了一个包含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".
如何创建计算列中字符串条目数的新列?
答案 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
是上面构造的对象。