在使用R语言中的reshape函数时出现了错误。

3

我有一个如下的数据框:

  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行的输出结果,这是错误的。请问有人能帮我找出我的错误在哪里吗?

4个回答

3

您期望的是这样吗?您只需要将 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,没有A和B。 - haimen
@haimen,这就是你的v.names和times参数所做的事情,请查看编辑。 - rawr

0

Reshape 很棒,但我真的不明白为什么你需要在这种情况下使用它。

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函数库(data.table),它可以使用pattern参数接受多个measure列。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接