Выполнение двоичной функции для столбца во фрейме данных
Вопрос
Допустим, у меня есть фрейм данных с содержимым:
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
Он преобразует логическое значение в целое число , и это работает ...однако есть ли лучший способ сделать это?