2016-09-15 3 views
0

Beispiel: Ich habe einen Höhen-Datensatz nach Geschlecht. Ich möchte die Höhen in niedrig und hoch teilen, wobei die Schnittpunkte als Mittelwert - 2sd innerhalb jedes Geschlechts definiert sind.Eine Variable basierend auf einer anderen Gruppierungsvariablen anders abschneiden

Beispiel-Datensatz:

set.seed(8) 
df = data.frame(sex = c(rep("M",100), rep("F",100)), 
       ht = c(rnorm(100, mean=1.7, sd=.17), rnorm(100, mean=1.6, sd=.16))) 

Ich mag etwas in einer einzigen Zeile von vektorisierten Code tun, weil ich ziemlich sicher bin, dass es möglich ist, aber ich weiß nicht, wie es zu schreiben. Ich stelle mir vor, dass es eine Möglichkeit gibt, cut(), apply() und/oder dplyr zu verwenden, um dies zu erreichen.

+0

Was war an meiner Frage, die dazu führte, dass Leute abstimmten? –

Antwort

0

entdeckt einfach die folgende Lösung Basis r mit:

df$ht_grp <- ave(x = df$ht, df$sex, 
       FUN = function(x) 
         cut(x, breaks = c(0, (mean(x, na.rm=T) - 2*sd(x, na.rm=T)), Inf))) 

Dies funktioniert, weil ich weiß, dass 0 und Inf vernünftigen Grenzen sind, aber ich konnte auch min(x) und max(x) als meine obere und untere Grenzen verwenden. Dies führt zu einer Faktorvariablen, die in niedrig, hoch und NA aufgeteilt wird.


Meine frühere Lösung: kam ich mit dem folgenden zweistufigen Verfahren auf, die nicht so schlecht ist:

df = merge(df, 
      setNames(aggregate(ht ~ sex, df, FUN = function(x) mean(x)-2*sd(x)), 
        c("sex", "ht_cutoff")), 
      by = "sex") 

df$ht_is_low = ifelse(df$ht <= df$ht_cutoff, 1, 0) 
+1

'df%>% group_by (Geschlecht)%>% mutieren (ht_is_low = as.integer (ht Psidom

1

Wie dies über cut von der Basis R mit:

sapply(c("F", "M"), function(s){ 
    dfF <- df[df$sex==s,] # filter out per gender 
    cut(dfF$ht, breaks = c(0, mean(dfF$ht)-2*sd(dfF$ht), Inf), labels = c("low", "high")) 
}) 
# dfF$ht heights per gender 
# mean(dfF$ht)-2*sd(dfF$ht) cut point 
0

Im folgenden Code habe ich 2 neue Variablen erstellt. Beide wurden durch Gruppieren der sex Variablen und Filtern der verschiedenen Bereiche von ht erstellt.

library(dplyr) 
df_low <- df %>% group_by(sex) %>% filter(ht<(mean(ht)-2*sd(ht))) 
df_high<- df %>% group_by(sex) %>% filter(ht>(mean(ht)+2*sd(ht))) 
Verwandte Themen