2010-02-12 2 views
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, но как я могу получить то, что я хочу?

ответ

1

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

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

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

as.integer(FALSE) #0 
as.integer(TRUE) #1 
+0

Отлично, спасибо, вот что я пытался сделать в целом, но если (d $ trial <3) 1 else 2 не работал. Я еще не нашел команду ifelse. –

0

Итак, я нашел решение, если я

(d$trial>=3)+1 

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

+0

Этот подход должен быть быстрее, чем делать ifelse. – Shane

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)) 
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 
Смежные вопросы