【发布时间】:2015-07-06 03:23:21
【问题描述】:
这是一个沉重的问题,但我会尽力解释。我正在尝试编写一个程序来跟踪昆虫随时间访问某种花卉的次数。为此,我有一个如下所示的数据集:
ID Visit_Freq Visitor_1 Visitor_2 Visitor_3 Visitor_4 Visitor_5
1 1.0000000 Halictidae <NA> <NA> <NA> <NA>
2 5.0000000 Syrphidae Halictidae Syrphidae Syrphidae Apis
3 1.0000000 Apis <NA> <NA> <NA> <NA>
4 0.0000000 <NA> <NA> <NA> <NA> <NA>
5 0.0000000 <NA> <NA> <NA> <NA> <NA>
6 0.0000000 <NA> <NA> <NA> <NA> <NA>
7 0.0000000 <NA> <NA> <NA> <NA> <NA>
8 2.0000000 Apis Apis <NA> <NA> <NA>
9 0.0000000 <NA> <NA> <NA> <NA> <NA>
10 0.0000000 <NA> <NA> <NA> <NA> <NA>
在“Visitor_n”列下,我记录了访问过那朵花的昆虫类型,或者没有访问过的 NA。为了分析我们的数据,我们必须在整个访客列中计算每种昆虫类型的出现次数。有时,一朵花 (ID) 可以有多达 10 个访客,而我们的 ID 计数通常超过 500,因此手动计算出现次数可能是一件苦差事。以下是我为使其更容易所做的工作:
Apis <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Apis'))))
到目前为止,上面的那一行已经很好地计算了 Apis 在我的真实数据集中出现的次数,但问题是实际上有几十种昆虫类型可能会或可能不会访问我们的植物,所以为了安全起见,我必须有大约 30-50 行类似的代码,每行都将“Apis”替换为不同的昆虫类型......例如......
Apis <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Apis'))))
Bombus <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Bombus'))))
Halictidae <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Halictidae'))))
Syrphidae <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Syrphidae'))))
Skipper <- sum(apply(DataSet[3:7], 2, function(x) length(which(x == 'Skipper'))))
等等等等
如果我能找到一种方法让 R 自动识别“昆虫 A、B、D、F 和 H 出现在 [3:7] 列中,这将是非常有帮助的,这里是它们出现的次数都发生了”,例如,而不必为每只昆虫打出 30-50 行来确保我没有遗漏任何东西。
我不反对为此安装软件包,但如果可能的话,我希望它尽可能接近基础 R。我想把这个介绍给我的一些几乎没有 R 经验的实验室伙伴。
我昨晚确实问了一个类似的问题,但从那以后我取得了一些进展。
【问题讨论】:
-
table(unlist(DataSet[, grep('Visitor', names(DataSet))]))? -
您遇到的根本问题是您的数据不整齐。您实际上应该只有 4 列,ID、Visit_Freq、Visitor_Number、Species。然后,在这种格式下,您想要做的很容易在 dplyr 中使用诸如
summarize或tally之类的函数。如果您可以发布生成您正在处理的类型的数据框的代码,那么我很乐意展示如何将其重新排列成整洁的形式,然后进行总结。 -
@ClausWilke 这怎么不“整洁”?这就是我们在业界通常所说的“宽”格式。有“宽”格式和“长”格式。您似乎在暗示“长”格式是“整洁的”,因此是“正确的”。也许如果一个人的技能只在哈德利宇宙中,那么使用长格式会更好,但我们不要建议人们以这种方式限制自己,好吗?
-
@rawr 在这里,“整洁”是一个技术术语,正如 Wickham 的论文中所定义的那样。这与格式是否正确无关。显然,长表和宽表都包含相同的信息,因此同样正确。然而,在许多情况下,长表的分析要简单得多,这仅仅是因为我们有更好的工具来处理长表而不是宽表。此外,在这种特殊情况下,访问者的数量是先验未知的,因此宽表似乎是一个特别糟糕的选择,这会导致大量的 NA。
-
@ClausWilke——我当然不介意。我目前在茫茫荒野中,很多时候几乎没有互联网访问权限,所以我可能有点难以回复每个人。感谢大家的回答,他们都很有见地。
标签: r