Disons que j'ai des données (df) avec deux colonnes. Une partie est donnée ci-dessous.
familyGroup male female 601 3 3 602 4 2
Sous la colonne Sexe, et . Je veux la somme du nombre d'hommes et de femmes pour un groupe familial et le rapport dans deux nouvelles colonnes (par exemple sous homme et femme)
J'utilisais dplyr
de tidyverse package
J'ai fait un essai avec
group_by
et summary
et mutate
J'ai essayé le code suivant en utilisant dplyr code >.
Cependant, le résultat n'est pas comme prévu.
df %>% group_by(familyGroup, Sex) %>% summarise(male = sum(Sex==1), female = sum(Sex == 2)) %>% select(familyGroup, male, female) # A tibble: 74 x 3 # Groups: familyGroup [40] familyGroup male female <fct> <int> <int> 1 601 3 0 2 601 0 3 3 602 4 0 4 602 0 2
Le résultat attendu ressemble à ce qui suit
familyGroup Sex 1 601 2 2 601 1 3 601 2 4 601 1 5 601 1 6 601 2 7 602 2 8 602 1 9 602 2 10 602 1 11 602 1 12 602 1
3 Réponses :
Nous pouvons compter
, familyGroup
et Sex
valeur. Remplacez 1 par "homme"
et 2 par "femme"
et diffusez
en grand format.
library(dplyr) df %>% count(familyGroup, Sex) %>% mutate(Sex = ifelse(Sex == 1, "male", "female")) %>% tidyr::spread(Sex, n) # familyGroup female male # <int> <int> <int> #1 601 3 3 #2 602 2 4
Merci beaucoup Ronak !. C'est la sortie souhaitée.
Au cas où il y aurait trois variables (disons homme, femme et transgenre) devrais-je développer la déclaration
@ manoj1123 oui, la raison de changer 1 en "homme" et 2 en "femme" est d'avoir des noms de colonne significatifs. Sinon df%>% count (familyGroup, Sex)%>% tidyr :: spread (Sex, n)
cela fonctionne également.
Il semble vraiment que ce soit un bon cas d'utilisation des fonctions de base.
df <- data.frame("familyGroup" = c(rep(601, 6), rep(602, 6)), "Sex" = c(2,1,2,1,1,2,2,1,2,1,1,1)) df$Sex <- ifelse(df$Sex == 1, "Male", "Female") table(df$familyGroup, df$Sex) Female Male 601 3 3 602 2 4
Si vous voulez une table plus complexe, ftable ()
ou xtabs ()
sont utiles.
p >
Vous pouvez le faire avec dcast
du package data.table
comme ceci:
library(data.table) library(dplyr) dt <- read.table(text = " familyGroup Sex 1 601 2 2 601 1 3 601 2 4 601 1 5 601 1 6 601 2 7 602 2 8 602 1 9 602 2 10 602 1 11 602 1 12 602 1") dt <- data.table(dt) dt[, sexLabel := dplyr::case_when( Sex == 1 ~ "male", Sex == 2 ~ "female", TRUE ~ "(unknown)" ) ] res <- dcast( formula = familyGroup ~ sexLabel, data = dt, fun.aggregate = length, value.var = "Sex" ) res # familyGroup female male # 1: 601 3 3 # 2: 602 2 4