簡體   English   中英

根據另一個分組變量以不同的方式剪切變量

[英]Cut a variable differently based on another grouping variable

示例:我有一個按性別划分的身高數據集。 我想將高度分為低點和高點,其中切點定義為均值-每個性別內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來實現。

如何使用基數R中的cut

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

剛剛使用base 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)

在下面的代碼中,我創建了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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM