Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用dcast处理大型数据集_R_Dataframe_Data Manipulation_Dcast - Fatal编程技术网

R 使用dcast处理大型数据集

R 使用dcast处理大型数据集,r,dataframe,data-manipulation,dcast,R,Dataframe,Data Manipulation,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, speci

抱歉,如果这是一个重复的问题,但我无法找到具体的答案,我正在寻找。我有一个数据框,其中包含在给定旅行中捕获的不同物种的计数。下面是一个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?或者有没有其他不需要强制转换数据的方法?多谢各位

这里是一个
数据表
方法,我想这对您来说非常快:

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
库(data.table)
setDT(dat)

结果我们可以使用
tidyverse

library(dplyr)
library(tidyr)
dat  %>%
   filter(species == 'b') %>% 
   group_by(trip, species) %>%
   summarise(count = sum(count)) %>% 
   ungroup %>% 
   complete(trip = unique(dat$trip), fill = list(species = 'b', count = 0))
# A tibble: 5 x 3
#   trip species count
#  <dbl> <chr>   <dbl>
#1     1 b           7
#2     2 b           1
#3     3 b           1
#4     4 b           0
#5     5 b           0
库(dplyr)
图书馆(tidyr)
dat%>%
过滤器(种类=='b')%>%
组别(行程、种类)%>%
汇总(计数=总和(计数))%>%
解组%>%
完成(行程=唯一(dat$trip),填充=列表(物种='b',计数=0))
#一个tibble:5x3
#旅行物种计数
#      
#11b7
#2 b 1
#3 b 1
#4b0
#5 b 0

成功了!非常感谢你。虽然运行了几分钟,但效果非常好。这样一个简单的解决方案谢谢akrun,很高兴知道还有一个tidyverse方法。然而,当我尝试使用我的实际数据时,对于我的物种没有被捕获的旅行,结果表中有NAs而不是零。也许是变量类的问题…?@FishMasterB。我使用
fill
in complete将NA更改为0