我有一个数据帧,称为"df",它包含了在过go 5年中检测到的大约250只命名的个体鸟类,大约11000行.Df具有日期、鸟、年、月、日和结果列.GROUP_BY/SUMMISE命令创建了一个新的表"df2",其中每只鸟都有一行,如果当月看到了鸟,则新列包含"1",如果没有检测到,则包含"0".这些列的命名格式为"YYMM",因此2020年3月在新表中显示为列"2003".现在,让这张桌子占据60多行的说明.我 for each 新专栏编写一行(50个月意味着我的命令将获得50行)--见下文.样本数据:

df <- data.frame(DATE = as.Date(c("02/16/18","03/16/18","03/16/18","04/16/18","05/16/18","05/19/18"),
                                format = "%m/%d/%y"),
                 BIRD = c("emww","emww","oaam","bbcm","bbcm","bbcm"),
                 YEAR = c(2018,2018,2018,2018,2018,2018),
                 MONTH = c(02,03,03,04,05,05),
                 OUTCOME = c(1,0,1,1,0,0))

工作正常但变得如此冗长的代码:

df2 <- df %>% 
  group_by(BIRD) %>% 
  summarise(
    "1802" = as.numeric(any(YEAR==2018 & MONTH == 2 & OUTCOME==1)),
    "1803" = as.numeric(any(YEAR==2018 & MONTH == 3 & OUTCOME==1)),
    "1804" = as.numeric(any(YEAR==2018 & MONTH == 4 & OUTCOME==1)),
    "1805" = as.numeric(any(YEAR==2018 & MONTH == 5 & OUTCOME==1)),
    "1806" = as.numeric(any(YEAR==2018 & MONTH == 6 & OUTCOME==1)),
    "1807" = as.numeric(any(YEAR==2018 & MONTH == 7 & OUTCOME==1)),
    "1808" = as.numeric(any(YEAR==2018 & MONTH == 8 & OUTCOME==1)))

(在五年的研究中,将有60行类似于上面的行,我只编辑了专栏标题、年份和月份,其他行都是相同的).

我很希望能够做一些像这样的事情

startdate <- as.Date("02/16/18", format = "%m/%d/%y")
enddate <- as.Date("12/16/23", format = "%m/%d/%y")

然后让R写出我那几个月的GROUP_BY/SUMMARY代码大块,而不是我手动编辑它.有谁对如何做到这一点(或其他更有效的方法)有什么建议吗?

推荐答案

你可以用reshape2::dcast美元让它变得简短而甜蜜.

> df |> transform(DATE=strftime(DATE, '%y%m')) |> 
+   reshape2::dcast(BIRD ~ DATE, fun=sum, value.var='OUTCOME')
  BIRD 1802 1803 1804 1805
1 bbcm    0    0    1    0
2 emww    1    0    0    0
3 oaam    0    1    0    0

使用sum作为假设按月求和的函数是有意的.

编辑

根据您的 comments ,我们可以将其包装在sign中以获得二进制文件.

> df |> transform(DATE=strftime(DATE, '%y%m')) |> 
+   reshape2::dcast(BIRD ~ DATE, fun=\(x) sign(sum(x)), value.var='OUTCOME')
  BIRD 1802 1803 1804 1805
1 bbcm    0    0    1    0
2 emww    1    0    0    0
3 oaam    0    1    0    0

Data:

> dput(df)
structure(list(DATE = structure(c(17578, 17606, 17606, 17637, 
17667, 17670), class = "Date"), BIRD = c("emww", "emww", "oaam", 
"bbcm", "bbcm", "bbcm"), YEAR = c(2018, 2018, 2018, 2018, 2018, 
2018), MONTH = c(2, 3, 3, 4, 5, 5), OUTCOME = c(1, 0, 1, 1, 0, 
0)), class = "data.frame", row.names = c(NA, -6L))

R相关问答推荐

使用gggplot 2在R中重新调整面板和y轴文本大小

如何根据包含相同值的某些列获取总额

查找满足SpatRaster中条件的单元格位置

检测(并替换)字符串中的数学符号

更改Heatmap Annotation对象的名称

将向量组合到一个数据集中,并相应地命名行

如何改变时间图R中的悬停信息?

如何计算多个日期是否在一个日期范围内

R中的哈密顿滤波

`lazy_dt`不支持`dplyr/across`?

R中边际效应包中Logistic回归的交互作用风险比

自定义gggraph,使geom_abline图层仅在沿x轴的特定范围内显示

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何平滑或忽略R中变量的微小变化?

扩展R中包含列表的数据框

构建一个6/49彩票模拟系统

注释不会绘制在所有ggplot2面上

R没有按顺序显示我的有序系数?

把代码写成dplyr中的group_by/摘要更简洁吗?

随机生成样本,同时在R内的随机样本中至少包含一次所有值