【问题标题】:r script to reshape and count columns within datasetr 脚本来重塑和计算数据集中的列
【发布时间】:2016-09-07 12:05:34
【问题描述】:

您好,我有一系列网站的淡水鱼数据集,多年来每月重复访问。每行都有发现的物种、总数和状态(即测试结果的阳性或阴性)。

sample_ID   site    coll_date   species TOT inf_status
382870  site 1  27/10/2007  Species B   1   positive
382872  site 2  27/10/2007  Species D   1   positive
487405  site 3  28/10/2007  Species A   1   positive
487405  site 3  28/10/2007  Species A   1   positive
382899  site 4  03/11/2007  Species A   1   positive
382900  site 5  03/11/2007  Species A   1   positive
382901  site 5  03/11/2007  Species A   1   positive
382902  site 6  03/11/2007  Species A   1   positive
382903  site 7  09/12/2007  Species B   1   positive
382904  site 8  05/02/2008  Species C   9   negative
382905  site 8  05/02/2008  Species A   13  negative
382906  site 9  14/02/2008  Species A   1   positive
382907  site 9  14/02/2008  Species A   1   positive

我需要重新格式化数据,以便每次站点访问只有一行(即在给定站点名称和日期组合中),其中包含按物种和鱼类状态(即物种A_pos、SpeciesA_neg、Sp_B_pos.. ETC)。

site    coll_date   SP_A_pos    SP_A_neg    SP_B_pos    SP_B_neg    SP_C_pos      SP_C_neg  SP_D_pos    SP_D_neg
site 1  27/10/2007  0   0   1   0   0   0   0   0
site 2  27/10/2007  0   0   0   0   0   0   1   0
site 3  28/10/2007  3   0   0   0   0   0   0   0
site 4  03/11/2007  1   0   0   0   0   0   0   0
site 5  03/11/2007  2   0   0   0   0   0   0   0
site 6  03/11/2007  1   0   0   0   0   0   0   0
site 7  09/12/2007  0   0   1   0   0   0   0   0
site 8  05/02/2008  0   13  0   0   0   9   0   0
site 9  14/02/2008  2   0   0   0   0   0   0   0

我想我可以使用 reshape 函数,但仍然需要在站点访问中求和,因为 reshape 将占据第一行。我的想法是使用 split/apply/aggregate/for 循环等,但尝试了各种组合但没有得到任何结果。抱歉,我对 R 不熟悉。感谢任何 cmets!

【问题讨论】:

  • 我猜你需要dcastlibrary(reshape2);dcast(df1, site+coll_date~species + inf_status, length)
  • 哇,谢谢 Akrun,这是一个优雅的解决方案。并道歉,我没有意识到这是一个重复的问题
  • @akrun 这不适用于计数大于 1 的行,例如对于站点 8 – 总数为 9,但上面的脚本返回 1。有什么想法吗?
  • 我重新打开了帖子。

标签: r reshape


【解决方案1】:

使用tidyr/dplyr,你可以新建一个变量,代表物种和状态的组合,对每个站点/日期/物种状态求和,然后spread物种状态进入列,填充和总和。

library(tidyr)
library(dplyr)

dat %>%
    unite(sp_status, species, inf_status) %>%
    group_by(site, coll_date, sp_status) %>%
    summarise(TOT = sum(TOT)) %>%
    spread(key = sp_status, value = TOT, fill = 0)

使用dcast 可以在reshape2 中完成相同的操作,利用dcast 同时聚合和重塑为宽格式的能力。

library(reshape2)
dcast(dat, site + coll_date ~ species + inf_status, value.var = "TOT", fun.aggregate = sum)

【讨论】:

  • 非常好,我几乎可以使用 dcast 代码,但一直收到错误消息“总和对因素无效”。非常感谢
  • 听起来像TOT 是一个因素(但不应该是)。这可能发生在您读取数据时;您可能在该列中有某种字符或符号。这通常是由于缺少值而发生的,例如使用“。”或“na”或“N/A”作为缺失值代码,在将数据集读入 R 时可以将其定义为实际缺失。最好弄清楚这一点。如果问题单元格应该是 NA,那么您可以使用dat$TOT = as.numeric(as.character(dat$TOT)) 进行转换。
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2015-09-30
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 2022-09-22
相关资源
最近更新 更多