我已经问过类似的问题,但我说的不对,所以答案对我没有帮助。同样,我有两个数据集,第一个是这样的:
df1 <- data.frame(id=c(111,111,111,222,222,333,333,333,333),
type=c("a","b","a","d","b","c","c","b","b"),
var=c(1,0,1,0,1,1,1,1,1))
df1
id type var
1 111 a 1
2 111 b 0
3 111 a 1
4 222 d 0
5 222 b 1
6 333 c 1
7 333 c 1
8 333 b 1
9 333 b 1
第二个是这样的:
df2
id A B
1 111
2 222
3 333
我需要填充空单元格,使得A是var
与a
或b
类型的总和,B是var
的总和为每个ID键入c
或d
。结果应该是这样的:
df2
id A B
1 111 2 0
2 222 1 0
3 333 2 2
填充这个非常重要的数据框(df2)非常重要,而不是创建新数据框
答案 0 :(得分:1)
它实际上只是聚合和重塑为广泛形式:
library(tidyverse)
# set grouping, edit var to A/B form
df1 %>% group_by(id, type = ifelse(type %in% c('a', 'b'), 'A', 'B')) %>%
summarise(var = sum(var)) %>%
spread(type, var, fill = 0) # reshape to wide
## Source: local data frame [3 x 3]
## Groups: id [3]
##
## id A B
## * <dbl> <dbl> <dbl>
## 1 111 2 0
## 2 222 1 0
## 3 333 2 2
如果您对A
进行了分组,则可以在B
中创建summarise
和var
,但代码更重复。
在基地R,
df2 <- df1
df2$type <- ifelse(df2$type %in% c('a', 'b'), 'A', 'B')
df2 <- aggregate(var ~ id + type, df2, sum)
df2 <- reshape(df2, timevar = 'type', direction = 'wide')
df2[is.na(df2)] <- 0L
names(df2) <- sub('var\\.', '', names(df2))
df2
## id A B
## 1 111 2 0
## 2 222 1 0
## 3 333 2 2
答案 1 :(得分:1)
我们可以在base R
中单行执行此操作(不使用任何外部程序包)
transform(as.data.frame.matrix(xtabs(var~id+type, df1)), A= a+b, B = c+d)[-(1:4)]
# A B
#111 2 0
#222 1 0
#333 2 2