说我有一个包含内容的数据框:
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
但我怎样才能达到我的目的?
答案 0 :(得分:1)
如果你想明确分配(并硬编码3的截止值),你可以使用
d$Day <- ifelse(d$trial<3, 1, 2)
这有点透明。否则,正如您所发现的,执行算术运算会将逻辑值转换为数字。您可以使用as.numeric
或as.integer
:
as.integer(FALSE) #0
as.integer(TRUE) #1
答案 1 :(得分: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))
答案 2 :(得分: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
答案 3 :(得分:0)
好的,所以我找到了一个解决方案,如果我这样做了
(d$trial>=3)+1
它将布尔值转换为整数并且它可以工作......但是,有更好的方法吗?