Выполнение двоичной функции для столбца во фрейме данных

StackOverflow https://stackoverflow.com/questions/2254701

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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