Exécution de la fonction binaire à une colonne dans une trame de données
Question
Dire que j'ai une trame de données avec le contenu:
Trial Person
1 John
2 John
3 John
4 John
1 Bill
2 Bill
3 Bill
4 Bill
et je veux transformer cela
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
Je peux faire très facilement
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
en faisant d$day=d$trial<3
mais comment puis-je obtenir ce que je veux?
La solution
Si vous voulez être explicite avec la mission (et coder en dur la coupure de 3), vous pouvez utiliser
d$Day <- ifelse(d$trial<3, 1, 2)
Ceci est un peu plus transparent. Dans le cas contraire, que vous avez découvert, en faisant une opération arithmétique convertit la valeur logique numérique. Vous pouvez le faire vous-même en utilisant as.numeric
ou as.integer
:
as.integer(FALSE) #0
as.integer(TRUE) #1
Autres conseils
Obtenir les données:
x <- read.table(textConnection(
"Trial Person
1 John
2 John
3 John
4 John
1 Bill
2 Bill
3 Bill
4 Bill"), header=TRUE)
Je pense que votre approche actuelle est la bonne (note: vous n'avez pas besoin as.numeric, car il est jeté automatiquement lorsque vous faites plus dans ce cas):
(x$Trial >= 3) + 1
Dans le cas contraire, voici une façon de le faire avec plyr.
library(plyr)
ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
Plus généralement, si vous essayez de convertir un vecteur de la forme c(1,2,3,4,5,6)
à c(1,1,2,2,3,3)
, comme si vous aviez deux essais par jour, alors vous voudrez peut-être exprimer en utilisant la division entière:
> x <- 1:6
> x
[1] 1 2 3 4 5 6
> (x-1) %/% 2 + 1
[1] 1 1 2 2 3 3
Ok, donc j'ai trouvé une solution, si je fais
(d$trial>=3)+1
Il convertit le booléen en entier, et cela fonctionne ... mais, est-il une meilleure façon de le faire?