簡體   English   中英

使用循環 [R] 為每個四分位數組分配中值

[英]Assign median value for each quartile group using loop [R]

我需要將數值變量分類為四分位數,並使用循環為四分位數組分配中值(因為我的原始數據集有很多變量)。

我打算對許多變量進行以下操作:

data(iris)
iris%>%mutate(Sepal.Lengthq=as.factor(ntile(Sepal.Length,4)))%>%
  group_by(Sepal.Lengthq)%>%
  mutate(Sepal.Lengthq_median=median(Sepal.Length,na.rm=T)) 

我需要循環,所以我寫了如下代碼:

quartilization=c("Sepal.Length","Sepal.Width")

for (i in seq_along(quartilization)){
  iris2=iris %>% 
    mutate(!!str_c(quartilization[i],"q"):=ntile(.[[quartilization[i]]],4)) %>% 
    group_by_at(vars(one_of(!!str_c(quartilization[i],"q")))) %>% 
    mutate(!!str_c(quartilization[i],"qn"):=median(.[[quartilization[i]]],na.rm=T)) %>%
    ungroup()
}

但是,1)它不返回“Sepal.Lengthqn”和 2)“Sepal.Widthqn”在樣本中是相同的值。

我覺得中位數 function 的語法是錯誤的,但無法修復。

如果有人可以與我分享一些意見,我將不勝感激。 謝謝你。

當您使用. ,您指的是整個 dataframe,因此您得到的所有年份的值都相同。 使用.data in median獲取組中的數據。

我使用map_dfc而不是for循環,因為它更簡單更短。 我還使用transmute而不是mutate ,因為mutate每次都返回所有列,而transmute只返回可以綁定到原始 dataframe 的更改的列。

library(dplyr)
library(purrr)
library(stringr)

quartilization=c("Sepal.Length","Sepal.Width")

bind_cols(iris, map_dfc(quartilization, ~{
            iris %>%
             group_by(!!str_c(.x,"q") := ntile(.[[.x]],4)) %>%
             transmute(!!str_c(.x,"qn"):= median(.data[[.x]],na.rm=TRUE))
}))

暫無
暫無

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

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