문제
이 질문은 이미 여기에 답이 있습니다.
큰 데이터 프레임을 재구성하는 데 어려움이 있습니다. 그리고 나는 과거의 문제를 재구성하는 것을 피하는 데 상대적으로 운이 좋았습니다. 이는 또한 내가 끔찍하다는 것을 의미합니다.
내 현재 데이터 프레임은 다음과 같습니다.
unique_id seq response detailed.name treatment
a N1 123.23 descr. of N1 T1
a N2 231.12 descr. of N2 T1
a N3 231.23 descr. of N3 T1
...
b N1 343.23 descr. of N1 T2
b N2 281.13 descr. of N2 T2
b N3 901.23 descr. of N3 T2
...
그리고 나는 원한다 :
seq detailed.name T1 T2
N1 descr. of N1 123.23 343.23
N2 descr. of N2 231.12 281.13
N3 descr. of N3 231.23 901.23
재구성 패키지를 살펴 보았지만 치료 요소를 개별 열 이름으로 어떻게 변환 할 수 있는지 잘 모르겠습니다.
감사!
편집 : 로컬 컴퓨터 (4GB 듀얼 코어 IMAC 3.06GHz)에서 이것을 실행하려고 시도했는데 다음과 같이 계속 실패합니다.
> d.tmp.2 <- cast(d.tmp, `SEQ_ID` + `GENE_INFO` ~ treatments)
Aggregation requires fun.aggregate: length used as default
R(5751) malloc: *** mmap(size=647168) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
기회가 생길 때 더 큰 기계 중 하나에서 이것을 실행해 보겠습니다.
해결책
Reshape는 항상 나에게도 까다로워 보이지만 항상 약간의 시행 착오로 작동하는 것 같습니다. 내가 찾은 것은 다음과 같습니다.
> x
unique_id seq response detailed.name treatment
1 a N1 123.23 dN1 T1
2 a N2 231.12 dN2 T1
3 a N3 231.23 dN3 T1
4 b N1 343.23 dN1 T2
5 b N2 281.13 dN2 T2
6 b N3 901.23 dN3 T2
> x2 <- melt(x, c("seq", "detailed.name", "treatment"), "response")
> x2
seq detailed.name treatment variable value
1 N1 dN1 T1 response 123.23
2 N2 dN2 T1 response 231.12
3 N3 dN3 T1 response 231.23
4 N1 dN1 T2 response 343.23
5 N2 dN2 T2 response 281.13
6 N3 dN3 T2 response 901.23
> cast(x2, seq + detailed.name ~ treatment)
seq detailed.name T1 T2
1 N1 dN1 123.23 343.23
2 N2 dN2 231.12 281.13
3 N3 dN3 231.23 901.23
원래 데이터는 이미 긴 형식 이었지만 Melt/Cast가 사용하는 긴 형식은 아닙니다. 그래서 나는 그것을 다시 만들었다. 두 번째 인수 (id.vars)는 녹지 말아야 할 것들의 목록입니다. 세 번째 인수 (측정 값)는 다른 것들의 목록입니다.
그런 다음 캐스트는 공식을 사용합니다. Tilde의 왼쪽에는 그대로 유지되는 것들이 있으며, 틸데의 오른쪽은 값 열을 조정하는 데 사용되는 열입니다.
다소 ...!
다른 팁
Harlan의 답변을 바탕으로 - 데이터가 이미 긴 형식이면 개최 값이 cast
전화.
> x <- read.table(textConnection(" unique_id seq response detailed.name treatment
+ 1 a N1 123.23 dN1 T1
+ 2 a N2 231.12 dN2 T1
+ 3 a N3 231.23 dN3 T1
+ 4 b N1 343.23 dN1 T2
+ 5 b N2 281.13 dN2 T2
+ 6 b N3 901.23 dN3 T2"))
>
> cast(x, seq + detailed.name ~ treatment, value = "response")
seq detailed.name T1 T2
1 N1 dN1 123.23 343.23
2 N2 dN2 231.12 281.13
3 N3 dN3 231.23 901.23
또 다른 옵션은 사용하는 것입니다 spread
~에서 tidyr
library(tidyr)
Wide1 <- spread(x[-1], treatment, response)
Wide1
# seq detailed.name T1 T2
#1 N1 dN1 123.23 343.23
#2 N2 dN2 231.12 281.13
#3 N3 dN3 231.23 901.23
반대 조치는 수행됩니다 gather
gather(Wide1, detailed.name, response, T1:T2)
# seq detailed.name detailed.name response
#1 N1 dN1 T1 123.23
#2 N2 dN2 T1 231.12
#3 N3 dN3 T1 231.23
#4 N1 dN1 T2 343.23
#5 N2 dN2 T2 281.13
#6 N3 dN3 T2 901.23
또한 있습니다 dcast.data.table
~에서 data.table
library(data.table)
dcast.data.table(setDT(x), seq + detailed.name~treatment,
value.var='response')
# seq detailed.name T1 T2
#1: N1 dN1 123.23 343.23
#2: N2 dN2 231.12 281.13
#3: N3 dN3 231.23 901.23
데이터
x <- structure(list(unique_id = structure(c(1L, 1L, 1L, 2L, 2L, 2L
), .Label = c("a", "b"), class = "factor"), seq = structure(c(1L,
2L, 3L, 1L, 2L, 3L), .Label = c("N1", "N2", "N3"), class = "factor"),
response = c(123.23, 231.12, 231.23, 343.23, 281.13, 901.23
), detailed.name = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("dN1",
"dN2", "dN3"), class = "factor"), treatment = structure(c(1L,
1L, 1L, 2L, 2L, 2L), .Label = c("T1", "T2"), class = "factor")), .Names =
c("unique_id", "seq", "response", "detailed.name", "treatment"), class =
"data.frame", row.names = c(NA, -6L))
당신은 또한 사용할 수 있습니다 reshape
기능 stats
패키지. 샘플 데이터 세트가 없지만 다음과 같이 보입니다.
reshape(x, idvar=c("seq","detailed.name"), timevar="treatment", direction="wide")
사용하여 동일한 결과를 얻으려면 reshape2
, 이것은 더 빠르고 더 많은 메모리 효율적인 재 작성입니다. reshape
패키지, 그러면 다음이 작동합니다.
주요 변화는 사용입니다 dcast
원할 때 기능하십시오 cast
a data.frame
출력으로. 이것은 대체합니다 cast
기능 reshape
library(reshape2)
x = read.table(text = "unique_id seq response detailed.name treatment
a N1 123.23 dN1 T1
a N2 231.12 dN2 T1
a N3 231.23 dN3 T1
b N1 343.23 dN1 T2
b N2 281.13 dN2 T2
b N3 901.23 dN3 T2",
sep = "", header = TRUE)
x
y <- dcast(x, seq + detailed.name ~ treatment, value.var = "response")
y
# seq detailed.name T1 T2
# 1 N1 dN1 123.23 343.23
# 2 N2 dN2 231.12 281.13
# 3 N3 dN3 231.23 901.23
# EDIT to show how to return to the original data set:
melt(y, id.vars=c('seq', 'detailed.name'), variable.name='T', value.name='response')
# seq detailed.name T response
# 1 N1 dN1 T1 123.23
# 2 N2 dN2 T1 231.12
# 3 N3 dN3 T1 231.23
# 4 N1 dN1 T2 343.23
# 5 N2 dN2 T2 281.13
# 6 N3 dN3 T2 901.23