문제

내용이 포함 된 데이터 프레임이 있다고 가정 해 봅시다.

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

부울을 정수로 변환하고 작동합니다. 그러나 더 좋은 방법이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top