我在这里看了很多类似的问题,但找不到解决这种情况的答案。我的数据框是这样的:
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)。
我想要的是一个宽的数据帧,如下所示。不能进行任何类型的求和/求平均值/数学运算:
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作为值。
df %>%
group_by(SET, SP) %>%
melt(id.vars = c('SET','SP')) %>%
data.table::dcast(SP + variable ~ SET, fun.aggregate = NULL, value.var = 'value')当我没有任何重复的集合时,这是有效的,但一旦我包含了完整的数据集,它就会失败。注意:我的实际数据帧大约是250万行,所以速度是个问题。
发布于 2017-02-25 11:01:24
这是dcast.data.table出类拔萃的地方。它允许多个参数作为'value.var',允许非常简洁的语法:
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发布于 2019-10-28 22:39:13
按照上面的@lukeA,但在dcast()函数调用中添加fun.aggregate = identity或fun.aggregate = list参数
发布于 2017-02-25 10:39:31
你可以试一试
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 1https://stackoverflow.com/questions/42451283
复制相似问题