Вырезать переменную по-другому на основе другой группирующей переменной

Пример: у меня есть набор данных по высоте по полу. Я хотел бы разделить высоты на низкие и высокие, где точки разреза определяются как среднее значение - 2sd для каждого пола.

пример набора данных:

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)))

Я хотел бы сделать что-то в одной строке векторизованного кода, потому что я вполне уверен, что это возможно, однако я не знаю, как это написать. Я предполагаю, что может быть способ использовать cut(), apply()и / или dplyr для достижения этой цели.

3 ответа

Решение

Просто обнаружил следующее решение с использованием базы r:

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)))

Это работает, потому что я знаю, что 0 и Inf - разумные границы, но я также мог бы использовать min(x), а также max(x) как мои верхние и нижние границы. Это приводит к факторной переменной, которая делится на низкие, высокие и NA.


Мое предыдущее решение: я придумал следующий двухэтапный процесс, который не так уж и плох:

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)

Как насчет этого, используя cut от базы R:

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

В приведенном ниже коде я создал 2 новые переменные. Оба были созданы путем группировки sex переменная и фильтрация различных диапазонов ht,

 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)))
Другие вопросы по тегам