r - 使用 dcast 操作大型数据集
问题描述
抱歉,如果这是一个重复的问题,但我找不到我正在寻找的具体答案。我有一个数据框,其中包含在给定旅行中捕获的不同物种的数量。下面是一个包含 5 个行程和 4 个物种的简化示例:
trip = c(1,1,1,2,2,3,3,3,3,4,5,5)
species = c("a","b","c","b","d","a","b","c","d","c","c","d")
count = c(5,7,3,1,8,10,1,4,3,1,2,10)
dat = cbind.data.frame(trip, species, count)
dat
> dat
trip species count
1 1 a 5
2 1 b 7
3 1 c 3
4 2 b 1
5 2 d 8
6 3 a 10
7 3 b 1
8 3 c 4
9 3 d 3
10 4 c 1
11 5 c 2
12 5 d 10
我只对每次旅行的物种 b 的数量感兴趣。所以我想操作这个数据框,所以我最终得到一个看起来像这样的数据框:
trip2 = c(1,2,3,4,5)
species2 = c("b","b","b","b","b")
count2 = c(7,1,1,0,0)
dat2 = cbind.data.frame(trip2, species2, count2)
dat2
> dat2
trip2 species2 count2
1 1 b 7
2 2 b 1
3 3 b 1
4 4 b 0
5 5 b 0
我想保留所有旅行,包括未观察到物种 b 的旅行。所以我不能只按物种 b 对数据进行子集化。我知道我可以将数据转换为列,然后删除其他物种的列,如下所示:
library(dplyr)
library(reshape2)
test = dcast(dat, trip ~ species, value.var = "count", fun.aggregate = sum)
test
> test
trip a b c d
1 1 5 7 3 0
2 2 0 1 0 8
3 3 10 1 4 3
4 4 0 0 1 0
5 5 0 0 2 10
然而,我的真实数据集有数百个物种在数千次旅行中被捕获,如果我尝试将这么多物种投射到 R 列中,就会窒息。列太多了。有没有办法在 dcast 中指定我只想投射物种 b?还是有另一种不需要转换数据的方法?谢谢你。
解决方案
这是一种data.table
我怀疑对您来说非常快的方法:
library(data.table)
setDT(dat)
result <- dat[,.(species = "b", count = sum(.SD[species == "b",count])),by = trip]
result
trip species count
1: 1 b 7
2: 2 b 1
3: 3 b 1
4: 4 b 0
5: 5 b 0
推荐阅读
- python-3.x - 合并多个子文件夹中同名的 csv 文件
- python - Python SQL Server时间戳在where子句中使用timedelta
- javascript - 向用户显示多个滑块值
- mysql - 如何查看数据字符串何时保存并显示为“??????”(UTF8)
- amazon-web-services - 当我在 Lambda@Edge 源请求函数中替换正文时出现验证错误
- python - python和c++对象的内存地址不相同
- javafx - 如何在单个 javafx 模板中的不同坐标处绘制 100 个二维形状(如圆形)?
- c# - 算子的预增量
- python - 如何修改满足条件的值下一行的值?
- python-3.x - 无法将时间序列图更改为每小时间隔