문제

이 질문은 이미 여기에 답이 있습니다.

큰 데이터 프레임을 재구성하는 데 어려움이 있습니다. 그리고 나는 과거의 문제를 재구성하는 것을 피하는 데 상대적으로 운이 좋았습니다. 이는 또한 내가 끔찍하다는 것을 의미합니다.

내 현재 데이터 프레임은 다음과 같습니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top