【问题标题】:Aggregating Dataset to "ignore" categorical variable聚合数据集以“忽略”分类变量
【发布时间】:2016-08-17 18:52:54
【问题描述】:

我有这个数据集,它的结构是这样的

Neighborhood,  var1,   var2,   COUNTRY, DAY, categ 1, categ 2
     1          700     724      AL      0      YES    YES
     1          500     200      FR      0      YES     NO
    ....
     1          701     659      IT      1      NO      YES
     1          791     669      IT      1      NO      YES
    ....
     2          239     222      GE      0      YES      NO

等等……

所以层次结构是“邻域 > 日 > 国家”,对于每个邻域、每一天、每个国家,我都有 var1、var2、categ1 和 categ2 的观察结果

目前我对分析国家/地区不感兴趣,所以我想做的是汇总它(通过对国家/地区字段 var1 和 var2 求和,分类变量 categ1 和 categ2 不受country),并有一个数据集,每个 Neighborhood 和每一天都为我提供有关 var1、var2、categ1 和 categ2 的信息

我对 R 编程很陌生,基本上不知道很多包(我会用 C++ 编写程序,但我强迫自己学习 R)... 那么你对如何做到这一点有任何想法吗?

数据

df1 <- structure(list(Neighborhood = c(1L, 1L, 1L, 1L, 2L),
                      var1 = c(700L, 500L, 701L, 791L, 239L),
                      var2 = c(724L, 200L, 659L, 669L, 222L),
                      COUNTRY = c("AL", "FR", "IT", "IT", "GE"),
                      DAY = c(0L, 0L, 1L, 1L, 0L),
                      `categ 1` = c("YES", "YES", "NO", "NO", "YES"), 
                      `categ 2` = c("YES", "NO", "YES", "YES", "NO")),
                 .Names = c("Neighborhood", "var1", "var2", "COUNTRY", "DAY", "categ 1", "categ 2"),
                 class = "data.frame", row.names = c(NA, -5L))

编辑:@akrun

当我尝试你的命令时,结果是:

聚合(.~Neighborhood+DAY+COUNTRY, data= df1[!grepl("^categ", names(df1))], mean)

     Neighborhood, DAY, COUNTRY, var1, var2

1            1      0      AL     700  724
2            1      0      FR     500  200
3            2      0      GE     239  222
4            1      1      IT     746  664

但是(在这个例子中)我想要的是:

         Neighborhood, DAY,  var1, var2

1            1          0     1200  924           //wher var1=700+500....
2            1          1     1492  1328
3            2          0     239  222

【问题讨论】:

  • 你要aggregate(.~Neighbourhood+DAY+COUNTRY, data= df1[!grepl("^categ, names(df1))], mean)
  • 不,我对分类列感兴趣,我对国家列不感兴趣......所以按照你的例子我应该这样做:聚合(.~Neighbourhood+DAY,data=df1[ !grepl("^COUNTRY, names(df1))], sum) 对吗?
  • 不,这行不通。如果您对分类列感兴趣,这些列是否包含在分组列中?
  • 分类变量只是对日期和街区进行分组,所以在聚合之前删除它们并稍后添加它们应该没问题?
  • 请检查解决方案。它做到了。

标签: r dataset aggregation categorical-data


【解决方案1】:

如果我们对 'categ' 列不感兴趣,我们可以将它们 grep 取出并使用 aggregate

aggregate(.~Neighborhood+DAY, data= df1[!grepl("^(categ|COUNTRY)", names(df1))], sum)
#   Neighborhood DAY var1 var2
#1            1   0 1200  924
#2            2   0  239  222
#3            1   1 1492 1328

或者使用dplyr

library(dplyr)
df1 %>%
   group_by(Neighborhood, DAY) %>%
   summarise_each(funs(sum), matches("^var"))
#  Neighborhood   DAY  var1  var2
#         (int) (int) (int) (int)
#1            1     0  1200   924
#2            1     1  1492  1328
#3            2     0   239   222

【讨论】:

  • aggregate(cbind(var1, var2) ~ COUNTRY, df1, mean)怎么样
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多