문제
내용이 포함 된 데이터 프레임이 있다고 가정 해 봅시다.
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
하지만 내가 원하는 것을 어떻게 얻을 수 있습니까?
해결책
과제를 명시하고 (및 3의 컷오프 하드 코딩) 명시하고 싶다면 사용할 수 있습니다.
d$Day <- ifelse(d$trial<3, 1, 2)
이것은 조금 더 투명합니다. 그렇지 않으면, 당신이 발견했듯이, 산술 조작을 수행하면 논리적 값을 숫자로 변환합니다. 당신은 사용하여 직접 할 수 있습니다 as.numeric
또는 as.integer
:
as.integer(FALSE) #0
as.integer(TRUE) #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))
보다 일반적으로 양식의 벡터를 변환하려는 경우 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
좋아, 그래서 나는 해결책을 찾았다면
(d$trial>=3)+1
부울을 정수로 변환하고 작동합니다. 그러나 더 좋은 방법이 있습니까?
제휴하지 않습니다 StackOverflow