0

假设我有一个包含内容的数据框:

Trial Person 
1     John   
2     John   
3     John   
4     John
1     Bill 
2     Bill
3     Bill
4     Bill

我想把它改造成

Trial Person Day
1     John   1
2     John   1
3     John   2
4     John   2
1     Bill   1
2     Bill   1
3     Bill   2
4     Bill   2

我可以很容易地做到

Trial Person Day
1     John   TRUE
2     John   TRUE
3     John   FALSE
4     John   FALSE
1     Bill   TRUE
2     Bill   TRUE
3     Bill   FALSE
4     Bill   FALSE

通过做d$day=d$trial<3,但我怎样才能得到我想要的?

4

4 回答 4

1

如果您想明确分配(并硬编码 3 的截止值),您可以使用

d$Day <- ifelse(d$trial<3, 1, 2)

这有点透明。否则,正如您所发现的,进行算术运算会将逻辑值转换为数字。您可以使用as.numericor自己完成as.integer

as.integer(FALSE)  #0
as.integer(TRUE)   #1
于 2010-02-12T20:04:55.810 回答
1

获取数据:

x <- read.table(textConnection(
"Trial Person 
1     John   
2     John   
3     John   
4     John
1     Bill 
2     Bill
3     Bill
4     Bill"), header=TRUE)

我认为您当前的方法是正确的(注意:您不需要 as.numeric,因为在这种情况下进行加法时它会自动转换):

(x$Trial >= 3) + 1

否则,这是一种使用 plyr 的方法。

library(plyr)
ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
于 2010-02-12T20:11:06.820 回答
1

更一般地,如果您尝试将形式的向量转换c(1,2,3,4,5,6)c(1,1,2,2,3,3),就像您每天进行两次试验一样,那么您可能希望使用整数除法来表达这一点:

> x <- 1:6
> x
[1] 1 2 3 4 5 6
> (x-1) %/% 2 + 1
[1] 1 1 2 2 3 3
于 2010-02-12T20:21:20.137 回答
0

好的,所以我找到了解决方案,如果我这样做了

(d$trial>=3)+1

它将布尔值转换为整数并且可以工作......但是,有没有更好的方法来做到这一点?

于 2010-02-12T19:59:30.763 回答