2015-12-09 2 views
1

У меня есть dataframe следующим образом,Ошибка при использовании перекраивать функции в 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 no As и Bs – haimen

+0

@haimen это то, что делали ваши аргументы v.names и times, см. правки – rawr

0

Reshape is a awesome, но я действительно не понимаю, почему вам нужно использовать его в этом случае.

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

Мы можем использовать melt из library(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 
Смежные вопросы