是否有用于在聚合数据上设置行的 R 函数?
Is there an R function for setting rows on aggregate data?
我正在使用的数据来自 eBird,我希望按名称和年份对物种出现情况进行分类。有超过 30k 个单独的观察结果,每个观察结果都有自己的鸟类数量。根据我在下面发布的原始数据,2021 年 1 月 1 日有人观察到 2 只库珀鹰等
原始看起来像这样:
specificName indivualCount eventDate year
Cooper's Hawk 1 (1/1/2018) 2018
Cooper's Hawk 1 (1/1/2020) 2020
Cooper's Hawk 2 (1/1/2021) 2021
理想情况下,我可以根据观察到的 year
对所有 Cooper's Hawks specificName
进行分组,并将总数 invidualcounts
相加。这样我就可以对 2018 年、2019 年、2020 年和 2021 年观察到的鸟类数量进行统计比较。
我为年份创建了单独的列
year <- as.POSIXct(ebird.df$eventDate, format = "%m/%d/%Y") ebird.df$year <- as.numeric(format(year, "%Y"))
然后汇总如下:
aggdata <- aggregate(ebird.df$individualCount , by = list( ebird.df$specificname, ebird.df$year ), FUN = sum)
有数百种鸟类,因此 Cooper's Hawks 从第 115 行开始,因此输出如下所示:
Group.1 Group.2 x
115 2018 Cooper's Hawk 86
116 2019 Cooper's Hawk 152
117 2020 Cooper's Hawk 221
118 2021 Cooper's Hawk 116
我的问题是如何将数据放入如下所示的 table 中:
Species Name 2018 2019 2020 2021
Cooper's Hawk 86 152 221 116
我最终想 运行 使用 vegan
对数据进行一些基本的生态统计,但我想首先要解决一个问题,哈哈
谢谢!
题目中的数据和代码有错误,所以我们使用了最后注释中给出的代码和可重现的数据。
现在,使用 xtabs 我们可以像这样直接从 ebird.df 得到一个 xtabs table。没有使用包。
xtabs(individualCount ~ specificName + year, ebird.df)
## year
## specificName 2018 2020 2021
## Cooper's Hawk 1 1 2
可选择将其转换为 data.frame:
xtabs(individualCount ~ specificName + year, ebird.df) |>
as.data.frame.matrix()
## 2018 2020 2021
## Cooper's Hawk 1 1 2
虽然我们不需要使用 aggdata,但如果您出于其他原因需要它,那么可以使用 aggregate.formula 计算它,如下所示:
aggregate(individualCount ~ specificName + year, ebird.df, sum)
备注
Lines <- "specificName,individualCount,eventDate,year
\"Cooper's Hawk\",1,(1/1/2018),2018
\"Cooper's Hawk\",1,(1/1/2020),2020
\"Cooper's Hawk\",2,(1/1/2021),2021"
ebird.df <- read.csv(text = Lines, strip.white = TRUE)
我正在使用的数据来自 eBird,我希望按名称和年份对物种出现情况进行分类。有超过 30k 个单独的观察结果,每个观察结果都有自己的鸟类数量。根据我在下面发布的原始数据,2021 年 1 月 1 日有人观察到 2 只库珀鹰等
原始看起来像这样:
specificName indivualCount eventDate year
Cooper's Hawk 1 (1/1/2018) 2018
Cooper's Hawk 1 (1/1/2020) 2020
Cooper's Hawk 2 (1/1/2021) 2021
理想情况下,我可以根据观察到的 year
对所有 Cooper's Hawks specificName
进行分组,并将总数 invidualcounts
相加。这样我就可以对 2018 年、2019 年、2020 年和 2021 年观察到的鸟类数量进行统计比较。
我为年份创建了单独的列
year <- as.POSIXct(ebird.df$eventDate, format = "%m/%d/%Y") ebird.df$year <- as.numeric(format(year, "%Y"))
然后汇总如下:
aggdata <- aggregate(ebird.df$individualCount , by = list( ebird.df$specificname, ebird.df$year ), FUN = sum)
有数百种鸟类,因此 Cooper's Hawks 从第 115 行开始,因此输出如下所示:
Group.1 Group.2 x
115 2018 Cooper's Hawk 86
116 2019 Cooper's Hawk 152
117 2020 Cooper's Hawk 221
118 2021 Cooper's Hawk 116
我的问题是如何将数据放入如下所示的 table 中:
Species Name 2018 2019 2020 2021
Cooper's Hawk 86 152 221 116
我最终想 运行 使用 vegan
对数据进行一些基本的生态统计,但我想首先要解决一个问题,哈哈
谢谢!
题目中的数据和代码有错误,所以我们使用了最后注释中给出的代码和可重现的数据。
现在,使用 xtabs 我们可以像这样直接从 ebird.df 得到一个 xtabs table。没有使用包。
xtabs(individualCount ~ specificName + year, ebird.df)
## year
## specificName 2018 2020 2021
## Cooper's Hawk 1 1 2
可选择将其转换为 data.frame:
xtabs(individualCount ~ specificName + year, ebird.df) |>
as.data.frame.matrix()
## 2018 2020 2021
## Cooper's Hawk 1 1 2
虽然我们不需要使用 aggdata,但如果您出于其他原因需要它,那么可以使用 aggregate.formula 计算它,如下所示:
aggregate(individualCount ~ specificName + year, ebird.df, sum)
备注
Lines <- "specificName,individualCount,eventDate,year
\"Cooper's Hawk\",1,(1/1/2018),2018
\"Cooper's Hawk\",1,(1/1/2020),2020
\"Cooper's Hawk\",2,(1/1/2021),2021"
ebird.df <- read.csv(text = Lines, strip.white = TRUE)