Exécution de la fonction binaire à une colonne dans une trame de données

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

  •  20-09-2019
  •  | 
  •  

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?

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top