Выполнение двоичной функции для столбца в кадре данных - PullRequest
0 голосов
/ 12 февраля 2010

Скажем, у меня есть фрейм данных с содержанием:

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 ]

1 голос
/ 12 февраля 2010

В целом, если вы пытаетесь преобразовать вектор вида 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
1 голос
/ 12 февраля 2010

Если вы хотите быть явным с назначением (и жестко кодировать отсечение 3), вы можете использовать

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

Это немного прозрачнее. В противном случае, как вы обнаружили, выполнение арифметической операции преобразует логическое значение в числовое. Вы можете сделать это самостоятельно, используя as.numeric или as.integer:

* +1007 *
1 голос
/ 12 февраля 2010

Получить данные:

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. * +1007 *

library(plyr)
ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
0 голосов
/ 12 февраля 2010

Хорошо, так что я нашел решение, если я сделаю

(d$trial>=3)+1

Он преобразует логическое значение в целое число, и это работает ... однако, есть ли лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...