首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >%r中的数据广播具有重复项且没有聚合

%r中的数据广播具有重复项且没有聚合
EN

Stack Overflow用户
提问于 2017-02-25 10:25:27
回答 4查看 2K关注 0票数 0

我在这里看了很多类似的问题,但找不到解决这种情况的答案。我的数据框是这样的:

代码语言:javascript
复制
SET SP   T1  T2  T3
A   dog  1  0   0
A   cat  0  NA  4
A   bird 5  0   NA
B   cat  2  0   0
B   bird NA 3   0
C   dog  1  0   0
C   cat  0  0   6
C   bird 0  0   0
D   dog  NA 22  1

其中SET被刻意重复多次,每个记录包括单个SP和多个试验的值(T1-3)。

我想要的是一个宽的数据帧,如下所示。不能进行任何类型的求和/求平均值/数学运算:

代码语言:javascript
复制
SET DOG_T1  DOG_T2  DOG_T3  CAT_T1  CAT_T2  CAT_T3  BIRD_T1 BIRD_T2 BIRD_T3
142   1     0       0      0        NA      4       5       0       NA
255  NA     NA     NA      2        0       0       NA      3       0
336   1     0      0       0        0       6       0       0       0
66   NA    22      1       NA       NA      NA      NA      NA      NA

我尝试了以下方法,但收到错误信息,默认长度为melt和dcast。这会将SET变量转换为不同的数字,并且仅填充0和1作为值。

代码语言:javascript
复制
df %>% 
  group_by(SET, SP) %>% 
  melt(id.vars = c('SET','SP')) %>%
  data.table::dcast(SP + variable ~ SET, fun.aggregate = NULL, value.var = 'value')

当我没有任何重复的集合时,这是有效的,但一旦我包含了完整的数据集,它就会失败。注意:我的实际数据帧大约是250万行,所以速度是个问题。

EN

回答 4

Stack Overflow用户

发布于 2017-02-25 11:01:24

这是dcast.data.table出类拔萃的地方。它允许多个参数作为'value.var',允许非常简洁的语法:

代码语言:javascript
复制
library(data.table)
dcast(df, SET ~ SP, value.var=c("T1", "T2", "T3"))
#   SET T1_bird T1_cat T1_dog T2_bird T2_cat T2_dog T3_bird T3_cat T3_dog
#1:   A       5      0      1       0     NA      0      NA      4      0
#2:   B      NA      2     NA       3      0     NA       0      0     NA
#3:   C       0      0      1       0      0      0       0      6      0
#4:   D      NA     NA     NA      NA     NA     22      NA     NA      1
票数 2
EN

Stack Overflow用户

发布于 2019-10-28 22:39:13

按照上面的@lukeA,但在dcast()函数调用中添加fun.aggregate = identityfun.aggregate = list参数

票数 1
EN

Stack Overflow用户

发布于 2017-02-25 10:39:31

你可以试一试

代码语言:javascript
复制
library(tidyverse)
df <- read.table(header=T, text="
SET SP   T1  T2  T3
A   dog  1  0   0
A   cat  0  NA  4
A   bird 5  0   NA
B   cat  2  0   0
B   bird NA 3   0
C   dog  1  0   0
C   cat  0  0   6
C   bird 0  0   0
D   dog  NA 22  1")
df %>% 
  gather(var, val, -(1:2)) %>% 
  unite("SP", SP, var) %>% 
  spread(SP, val)
#   SET bird_T1 bird_T2 bird_T3 cat_T1 cat_T2 cat_T3 dog_T1 dog_T2 dog_T3
# 1   A       5       0      NA      0     NA      4      1      0      0
# 2   B      NA       3       0      2      0      0     NA     NA     NA
# 3   C       0       0       0      0      0      6      1      0      0
# 4   D      NA      NA      NA     NA     NA     NA     NA     22      1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42451283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档