data.table 总和和子集
data.table sum and subset
我有一个 data.table 想要聚合
library(data.table)
dt1 <- data.table(year=c("2001","2001","2001","2002","2002","2002","2002"),
group=c("a","a","b","a","a","b","b"),
amt=c(20,40,20,35,30,28,19))
我想 sum
按年份和组计算 amt,然后过滤任何给定组的 amt 总和大于 100 的地方。
我已经确定了 data.table 总和。
dt1[, sum(amt),by=list(year,group)]
year group V1
1: 2001 a 60
2: 2001 b 20
3: 2002 a 65
4: 2002 b 47
我的最终过滤级别有问题。
我想要的最终结果是:
year group V1
1: 2001 a 60
2: 2002 a 65
作为 a) 60 + 65 > 100
而 b) 20 + 47 <= 100
任何关于如何实现这一点的想法都会很棒。
我看过这个 并且想知道他们是否同样 eloquent 解决了我的问题。
你可以这样做:
library(dplyr)
dt1 %>%
group_by(group, year) %>%
summarise(amt = sum(amt)) %>%
filter(sum(amt) > 100)
给出:
#Source: local data table [2 x 3]
#Groups: group
#
# year group amt
#1 2001 a 60
#2 2002 a 65
这是两班。首先找到您想要的小组子集
big_groups <- dt1[,sum(amt),by=group][V1>100]$group
dt1[group%in%big_groups,sum(amt),by=list(year,group)]
这可能不是一个理想的解决方案,但我会按照以下几个步骤进行操作:
dt2=dt1[, sum(amt),by=list(year,group)]
dt3=dt1[, sum(amt)>100,by=list(group)]
dt_result=dt2[group %in% dt3[V1==TRUE]$group,]
data.table
中的单行:
dt1[, lapply(.SD,sum), by=.(year,group)][, if (sum(amt) > 100) .SD, by=group]
# group year amt
#1: a 2001 60
#2: a 2002 65
我有一个 data.table 想要聚合
library(data.table)
dt1 <- data.table(year=c("2001","2001","2001","2002","2002","2002","2002"),
group=c("a","a","b","a","a","b","b"),
amt=c(20,40,20,35,30,28,19))
我想 sum
按年份和组计算 amt,然后过滤任何给定组的 amt 总和大于 100 的地方。
我已经确定了 data.table 总和。
dt1[, sum(amt),by=list(year,group)]
year group V1
1: 2001 a 60
2: 2001 b 20
3: 2002 a 65
4: 2002 b 47
我的最终过滤级别有问题。
我想要的最终结果是:
year group V1
1: 2001 a 60
2: 2002 a 65
作为 a) 60 + 65 > 100
而 b) 20 + 47 <= 100
任何关于如何实现这一点的想法都会很棒。
我看过这个
你可以这样做:
library(dplyr)
dt1 %>%
group_by(group, year) %>%
summarise(amt = sum(amt)) %>%
filter(sum(amt) > 100)
给出:
#Source: local data table [2 x 3]
#Groups: group
#
# year group amt
#1 2001 a 60
#2 2002 a 65
这是两班。首先找到您想要的小组子集
big_groups <- dt1[,sum(amt),by=group][V1>100]$group
dt1[group%in%big_groups,sum(amt),by=list(year,group)]
这可能不是一个理想的解决方案,但我会按照以下几个步骤进行操作:
dt2=dt1[, sum(amt),by=list(year,group)]
dt3=dt1[, sum(amt)>100,by=list(group)]
dt_result=dt2[group %in% dt3[V1==TRUE]$group,]
data.table
中的单行:
dt1[, lapply(.SD,sum), by=.(year,group)][, if (sum(amt) > 100) .SD, by=group]
# group year amt
#1: a 2001 60
#2: a 2002 65