[英]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.