聚合(df,...)返回NAs?

时间:2015-07-25 09:40:30

标签: r dataframe warnings aggregate na

我想通过变量“id”和“var1”在这个数据框上应用聚合函数

varchar

但是,如果我这样做,我会收到很多警告和一个满是NAs的专栏

df <- structure(list (id = c(1L,1L,1L,1L,2L,2L,2L,2L),
        var1 = structure(c(1L,1L,2L,2L,1L,1L,2L,2L),
          .Label = c("A", "B"), class = "factor"), 
        var2 = c(1L,2L,1L,2L,1L,2L,1L,2L),
        values = c(37L,20L,22L,18L,30L,5L,41L,50L)),
        .Names = c("id","var1","var2","values"),
        class = "data.frame", row.names = c(NA,-8L))

# looks like
> df
  id var1 var2 values
1  1    A    1     37
2  1    A    2     20
3  1    B    1     22
4  1    B    2     18
5  2    A    1     30
6  2    A    2      5
7  2    B    1     41
8  2    B    2     50

有没有办法防止这些警告?由于这些,我的汇总结果丢失了一些数据?

3 个答案:

答案 0 :(得分:2)

试试这个

aggregate( . ~ id + var1 , data = df, mean)

#  id var1 var2 values
#1  1    A  1.5   28.5
#2  2    A  1.5   17.5
#3  1    B  1.5   20.0
#4  2    B  1.5   45.5

以下是其他一些选项

使用dplyr

library(dplyr)
df %>% group_by(id, var1) %>% summarize(var2 = mean(var2), values = mean(values))
#or simply
df %>% group_by(id, var1) %>% summarise_each(funs(mean))

#Source: local data frame [4 x 4]
#Groups: id
#  id var1 var2 values
#1  1    A  1.5   28.5
#2  2    A  1.5   17.5
#3  1    B  1.5   20.0
#4  2    B  1.5   45.5

使用data.table,您有两种选择:

library(data.table)
setDT(df)[, .(var2 = mean(var2), values = mean(values)), by = .(id, var1)] # option 1
setDT(df)[, lapply(.SD, mean), by=.(id,var1), .SDcols=c("var2","values")] # option 2

#   id var1 var2 values
#1:  1    A  1.5   28.5
#2:  1    B  1.5   20.0
#3:  2    A  1.5   17.5
#4:  2    B  1.5   45.5

使用ddply

library(plyr)
ddply(df, .(id,var1), colwise(mean))

#  id var1 var2 values
#1  1    A  1.5   28.5
#2  1    B  1.5   20.0
#3  2    A  1.5   17.5
#4  2    B  1.5   45.5

答案 1 :(得分:1)

您需要将为参数x提供的数据框限制为要应用FUN的列。因此,在您的示例中,您希望将均值函数应用于值列,按idvar1分组,因此您需要指定 df$values 而不是只需 df

agg <- aggregate(df$values, by=list(df$id, df$var1), mean)

答案 2 :(得分:0)

因为您的第一个参数(data=df, ...)要求它汇总所有df的列(而不仅仅是单个列values)。

您想要(data=df$values,...

或者像其他人所说的那样使用公式界面。