gpt4 book ai didi

r - 将汇总值表与来自 'parent' 数据集的汇总变量相结合

转载 作者:行者123 更新时间:2023-12-01 11:48:20 25 4
gpt4 key购买 nike

我有一个沿着这些方向的数据集:

df<-data.frame(sp=c(100, 100, 100, 101, 101, 101, 102, 102, 102),
type=c("C","C","C","H","H","H","C","C","C"),
country=c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
vals=c(1,2,3,4,5,6,7,8,9)
)

我想汇总 df$vals 并同时引入其他变量

目前我是这样做的:

multi.func<- function(x){
c(
n = length(x),
min = min(x, na.rm=TRUE),
max = max(x, na.rm=TRUE),
mean = mean(x, na.rm=TRUE)
)}

aggVals<-as.data.frame(do.call(rbind, by(df$vals, df$sp, FUN=multi.func, simplify=TRUE)))
aggVals$sp<-row.names(aggVals)

aggDescrip<-aggregate(cbind(as.character(type), as.character(country)) ~ sp, data=df, FUN=unique)

result<-merge(aggDescrip,aggVals)

这很有效,但我想知道是否有更简单的方法。

谢谢

最佳答案

也许您应该查看 data.table 包。

library(data.table)
DT <- data.table(df, key="sp")
DT[, list(type = unique(as.character(type)),
country = unique(as.character(country)),
n = .N, min = min(vals), max = max(vals),
mean = mean(vals)), by=key(DT)]
# sp type country n min max mean
# 1: 100 C A 3 1 3 2
# 2: 101 H B 3 4 6 5
# 3: 102 C C 3 7 9 8

如果你想坚持使用 base R,这里有另一种可能有用的方法(虽然 aggregate 可能更常见):

unique(within(df, {
mean <- ave(vals, sp, FUN=mean)
max <- ave(vals, sp, FUN=max)
min <- ave(vals, sp, FUN=min)
n <- ave(vals, sp, FUN=length)
rm(vals)
}))
# sp type country n min max mean
# 1 100 C A 3 1 3 2
# 4 101 H B 3 4 6 5
# 7 102 C C 3 7 9 8

更新:您最初尝试的变体

如果可能的话,我建议坚持使用 data.table,因为生成的代码很容易理解,聚合过程也很快。

但是,通过稍作修改,您可以获得(又一种)更直接的基本 R 方法。

首先,修改您的函数,以便使用 data.frame 而不是使用 c()。此外,添加一个参数来指定需要聚合的列。

multi.func <- function(x, value_column) {
data.frame(
n = length(x[[value_column]]),
min = min(x[[value_column]], na.rm=TRUE),
max = max(x[[value_column]], na.rm=TRUE),
mean = mean(x[[value_column]], na.rm=TRUE))
}

其次,在您的数据集上使用lapply,根据您的分组变量拆分合并输出与您的原始数据集,并返回唯一值。

unique(merge(df[-4], 
do.call(rbind, lapply(split(df, df$sp),
multi.func, value_column = "vals")),
by.x = "sp", by.y = "row.names"))

关于r - 将汇总值表与来自 'parent' 数据集的汇总变量相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com