我在这里查看了很多类似的问题,但无法找到解决这种情况的答案。我的数据框是这样的:
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万行,所以速度很值得关注。
答案 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())