dcast在r中有重复且没有聚合

时间:2017-02-25 02:25:27

标签: r data-cleaning

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

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和多个TRIALS(T1-3)的值。

我想要的是如下的宽数据帧。任何类型都没有求和/平均/数学运算:

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

我已经尝试了以下内容,但是收到了熔化和dcast默认长度的错误。这会将SET变量转换为不同的数字,并仅为该值填充0和1。

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

当我没有任何重复的SET时,这是有效的,但是一旦我包含完整的数据集就会失败。 注意:我的实际数据框大约有250万行,所以速度很值得关注。

4 个答案:

答案 0 :(得分:2)

这是AT_HWCAP: bfebfbff擅长的情况。它允许多个参数为'value.var',允许非常简洁的语法:

dcast.data.table

答案 1 :(得分:0)

你可以尝试

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

答案 2 :(得分:0)

按照上述@lukeA,但在fun.aggregate = identity函数调用中添加dcast()参数

答案 3 :(得分:0)

由于我目前的名声不允许在上述@lukeA答案中添加评论,因此我将其作为一个新答案,更多是一个建议:

使用data.table函数setcolorder可以将列重新排序为“ bird_T1,cat_T1,dog_T1,bird_T2,cat_T2等”。通过使用类似于

的自定义函数
newOrder <- function() {

      lapply(1:max(index)
             , function(i) grep(
                                 sprintf('%s', i)
                                           , names(DT), value = TRUE)
        )}

其中index是创建的索引,以便允许dcast.data.table使用重复的键,例如上面的初始表中的SET变量:

DT[, index := 1:.N, by = SET]

最后,新订单以常规方式达成:

setcolorder(dcast(DT), neworder = newOrder())