gpt4 book ai didi

r - 如何通过汇总 dplyr 函数循环多个数据帧中的数据

转载 作者:行者123 更新时间:2023-12-01 19:26:55 32 4
gpt4 key购买 nike

您好,我写这篇文章是因为我试图通过与第二个数据集中的变量关联的循环放置 group_by 和 summarize 函数。我尝试通过 for 循环和 apply 循环来做到这一点。

我有一个数据集,它是物种和属性的列表。d1 看起来像

Species Height
Cenjac 67
Cirarv 24

d2 是我通常总结的斑 block 数据,其中包含每个斑 block 中是否存在物种、最近的斑 block (目标)以及斑 block 的大小。

Patch  Target  Size   Cenjac Cirarv 
a c 250 0 1
b a 18 1 0
c a 20 1 0

我的常规汇总方法是手动通过 group_by 进行汇总并创建一个新变量,该变量是 d1 的高度、d2 的大小和存在/不存在。我需要每次都写下高度。 (注意:这不是我真正的方程)

DfullCJ<- group_by(d2, Patch, Target) %>% summarise(Cenjacmax=(67*Size*Cenjac))

然后我每次都需要为每个物种重新编写代码

 DfullCA<- group_by(d2, Patch, Target) %>% summarise(Cirarvmax=(24*Size*Cirarv))

理想情况下,我能够通过 for 循环或 apply 自动化此过程。有没有办法将物种名称设置为变量,然后从 d1 中提取高度和相应的物种名称(也是 d2 中存在缺席列的名称)以插入到 group_by 汇总函数中。或者或以 d1 作为列表通过循环运行该函数。

感谢任何可以帮助我的人。

最佳答案

考虑将数据从宽调整为长,以创建物种指标列,然后合并到高度数据以进行所需的计算或聚合。通常,长格式是数据科学中的首选格式,因为聚合、合并、绘图、建模和其他方法更容易,无需循环数百个指标列。

reshape

d2_long <- reshape(d2, varying = list(names(d2)[4:ncol(d2)]), v.names = "Indicator",
times = names(d2)[4:ncol(d2)], timevar = "Species",
new.row.names = 1:1E5, direction = "long")
d2_long
# Patch Target Size Species Indicator id
# 1 a c 250 Cenjac 0 1
# 2 b a 18 Cenjac 1 2
# 3 c a 20 Cenjac 1 3
# 4 a c 250 Cirarv 1 1
# 5 b a 18 Cirarv 0 2
# 6 c a 20 Cirarv 0 3

合并

merge_df <- merge(d2_long, d1, by="Species")
merge_df$Value <- with(merge_df, Size*Height*Indicator)

merge_df

# Species Patch Target Size Indicator id Height Value
# 1 Cenjac a c 250 0 1 67 0
# 2 Cenjac b a 18 1 2 67 1206
# 3 Cenjac c a 20 1 3 67 1340
# 4 Cirarv a c 250 1 1 24 6000
# 5 Cirarv b a 18 0 2 24 0
# 6 Cirarv c a 20 0 3 24 0

聚合

agg_raw <- aggregate(Value ~ Patch + Target, merge_df, 
function(x) c(count=length(x), min=min(x), median=median(x),
mean=mean(x), max=max(x)))

agg_df <- do.call(data.frame, agg_raw)
agg_df

# Patch Target Value.count Value.min Value.median Value.mean Value.max
# 1 b a 2 0 603 603 1206
# 2 c a 2 0 670 670 1340
# 3 a c 2 0 3000 3000 6000

Rextester demo

关于r - 如何通过汇总 dplyr 函数循环多个数据帧中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478200/

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