0
votes

compter plusieurs catégories d'une variable à partir d'une colonne et les rapporter en créant de nouvelles colonnes

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


0 commentaires

3 Réponses :


1
votes

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


3 commentaires

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 pour l'inclure.


@ 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.



2
votes

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 >


0 commentaires

2
votes

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


0 commentaires