我有数据框ds
CountyID ZipCode Value1 Value2 Value3 ... Value25
1 1 0 etc etc etc
2 1 3
3 1 0
4 1 1
5 2 2
6 3 3
7 4 7
8 4 2
9 5 1
10 6 0
并希望根据ds$ZipCode
进行汇总,并根据最高ds$CountyID
将ds$Value1
设置为等于主要县。对于上面的示例,它看起来像这样:
CountyID ZipCode Value1 Value2 Value3 ... Value25
2 1 4 etc etc etc
5 2 2
6 3 3
7 4 9
9 5 1
10 6 0
所有ValueX
列都是按ZipCode
分组的列的总和。
在过去的几天里,我尝试过一系列不同的策略,但都没有奏效。我提出的最好的是
#initialize the dataframe
ds_temp = data.frame()
#loop through each subset based on unique zipcodes
for (zip in unique(ds$ZipCode) {
sub <- subset(ds, ds$ZipCode == zip)
len <- length(sub)
maxIndex <- which.max(sub$Value1)
#do the aggregation
row <- aggregate(sub[3:27], FUN=sum, by=list(
CountyID = rep(sub$CountyID[maxIndex], len),
ZipCode = sub$ZipCode))
rbind(ds_temp, row)
}
ds <- ds_temp
我还没有能够在真实数据上对此进行测试,但是对于虚拟数据集(例如上面的数据集),我不断得到错误&#34;参数必须具有相同的长度)。我用rep()和固定向量(例如c(1,2,3,4)
)搞砸了,但不管我做什么,错误仍然存在。我偶尔也会遇到错误
不能对类型&#39;关闭&#39;
的数据进行子集化
有什么想法吗?我也尝试过使用data.frame()
,ddply()
,data.table()
,dcast()
等等。
答案 0 :(得分:2)
你可以试试这个:
data.frame(aggregate(df[,3:27], by=list(df$ZipCode), sum),
CountyID = unlist(lapply(split(df, df$ZipCode),
function(x) x$CountyID[which.max(x$Value1)])))
完全可重复的样本数据:
df<-read.table(text="
CountyID ZipCode Value1
1 1 0
2 1 3
3 1 0
4 1 1
5 2 2
6 3 3
7 4 7
8 4 2
9 5 1
10 6 0", header=TRUE)
data.frame(aggregate(df[,3], by=list(df$ZipCode), sum),
CountyID = unlist(lapply(split(df, df$ZipCode),
function(x) x$CountyID[which.max(x$Value1)])))
# Group.1 x CountyID
#1 1 4 2
#2 2 2 5
#3 3 3 6
#4 4 9 7
#5 5 1 9
#6 6 0 10
答案 1 :(得分:1)
在回答您对Frank答案的评论时,您可以使用aggregate
中的公式方法保留列名称。使用Franks的数据df
,这将是
> cbind(aggregate(Value1 ~ ZipCode, df, sum),
CountyID = sapply(split(df, df$ZipCode), function(x) {
with(x, CountyID[Value1 == max(Value1)]) }))
# ZipCode Value1 CountyID
# 1 1 4 2
# 2 2 2 5
# 3 3 3 6
# 4 4 9 7
# 5 5 1 9
# 6 6 0 10