具有R

时间:2016-12-17 23:42:05

标签: r sum

我已经问过类似的问题,但我说的不对,所以答案对我没有帮助。同样,我有两个数据集,第一个是这样的:

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是varab类型的总和,B是var的总和为每个ID键入cd。结果应该是这样的:

df2
   id A B 
1 111 2 0
2 222 1 0
3 333 2 2

填充这个非常重要的数据框(df2)非常重要,而不是创建新数据框

2 个答案:

答案 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中创建summarisevar,但代码更重复。

在基地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