2015-12-09 71 views
1

重塑功能我有一個數據幀如下,錯誤而使用R中

id sex age trt.1 response.1 trt.2 response.2 
1 1 <NA> NA  A   1  B   1 
2 2 <NA> NA  A   1  B   1 
3 3 <NA> NA  A   1  B   1 
4 4 M 28  A   1  B   1 
5 5 F 39  A   1  B   1 
6 6 M 47  A   1  B   1 

我想將其更改爲

id sex age times response 
1 1 <NA> NA A  1 
2 1 <NA> NA B  1 
3 2 <NA> NA A  1 
4 2 <NA> NA B  1 
. 
. 
. 
. 

我嘗試以下,

reshape(merged, idvar = "id", varying = list(4:7), v.names="response", times=c("A","B"), direction="long") 

但我得到這個錯誤,

Error in reshapeLong(data, idvar = idvar, timevar = timevar, varying = varying, : 
    'times' is wrong length 

我試過times = C(「A」,「B」,「A」,「B」)那次我得到輸出,但原始數據幀是70行,輸出應該是140行,但是當我用這個我得到280行這是錯誤的。有人可以幫我解決我犯的錯誤嗎?

回答

2

這是你所期待的嗎?您只需要將varying = list(4:7)更改爲varying = list(c(4,6), c(5,7)),因爲您實際上是在同時融化兩件。

dd <- read.table(stringsAsFactors = FALSE, header = TRUE, text = "id sex age trt.1 response.1 trt.2 response.2 
1 1 <NA> NA  A   1  B   1 
2 2 <NA> NA  A   1  B   1 
3 3 <NA> NA  A   1  B   1 
4 4 M 28  A   1  B   1 
5 5 F 39  A   1  B   1 
6 6 M 47  A   1  B   1") 


reshape(dd, idvar = "id", varying = list(c(4,6), c(5,7)), direction="long", 
     v.names = c('trt','response')) 

#  id sex age time trt response 
# 1.1 1 <NA> NA 1 A  1 
# 2.1 2 <NA> NA 1 A  1 
# 3.1 3 <NA> NA 1 A  1 
# 4.1 4 M 28 1 A  1 
# 5.1 5 F 39 1 A  1 
# 6.1 6 M 47 1 A  1 
# 1.2 1 <NA> NA 2 B  1 
# 2.2 2 <NA> NA 2 B  1 
# 3.2 3 <NA> NA 2 B  1 
# 4.2 4 M 28 2 B  1 
# 5.2 5 F 39 2 B  1 
# 6.2 6 M 47 2 B  1 
+1

您的輸出不會提供我想要的確切輸出。雖然它給了我一個如何去做的想法。你能正確幫助我嗎?響應應該是1s否As和Bs – haimen

+0

@haimen這就是你的名字和時間參數所做的,參見編輯 – rawr

0

重塑很棒,但我真的不明白爲什麼你需要在這種情況下使用它。

text = "id sex age trt.1 response.1 trt.2 response.2 
1 1 <NA> NA  A   1  B   1 
2 2 <NA> NA  A   1  B   1 
3 3 <NA> NA  A   1  B   1 
4 4 M 28  A   1  B   1 
5 5 F 39  A   1  B   1 
6 6 M 47  A   1  B   1" 

data <- read.table(text = text) 

result1 <- data[, c("id", "sex", "age", "trt.1", "response.1")] 
result2 <- data[, c("id", "sex", "age", "trt.2", "response.2")] 

names(result1) <- c("id", "sex", "age", "trt", "response") 
names(result2) <- c("id", "sex", "age", "trt", "response") 

result <- rbind(result1, result2) 

這裏是輸出:

id sex age trt response 
1 1 <NA> NA A  1 
2 2 <NA> NA A  1 
3 3 <NA> NA A  1 
4 4 M 28 A  1 
5 5 F 39 A  1 
6 6 M 47 A  1 
11 1 <NA> NA B  1 
... 
0

這裏是tidyr辦法做到這一點:

library(dplyr) 
library(tidyr) 

data %>% 
    gather(variable, value, 
     trt.1:response.2) %>% 
    separate(variable, c("variable", "number")) %>% 
    spread(variable, value) 
0

我們可以使用meltlibrary(data.table)可以採取多種measure列與pattern論點

library(data.table)#v1.9.6+ 
melt(setDT(df2), measure=patterns('^trt', 'response'), value.name=c('times', 'response')) 
# id sex age variable times response 
# 1: 1 <NA> NA  1  A  1 
# 2: 2 <NA> NA  1  A  1 
# 3: 3 <NA> NA  1  A  1 
# 4: 4 M 28  1  A  1 
# 5: 5 F 39  1  A  1 
# 6: 6 M 47  1  A  1 
# 7: 1 <NA> NA  2  B  1 
# 8: 2 <NA> NA  2  B  1 
# 9: 3 <NA> NA  2  B  1 
#10: 4 M 28  2  B  1 
#11: 5 F 39  2  B  1 
#12: 6 M 47  2  B  1