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