r - 使用循环 [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”在样本中是相同的值。
我觉得中值函数的语法是错误的,但无法修复。
如果有人可以与我分享一些意见,我将不胜感激。谢谢你。
解决方案
当您使用.
时,您指的是整个数据框,因此您会在所有年份中获得相同的值。用于获取组中的数据.data
。median
我使用map_dfc
而不是for
循环,因为它更容易更短。我也使用transmute
而不是mutate
因为mutate
每次都返回所有列,而transmute
只返回可以绑定到原始数据框的更改列。
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))
}))
推荐阅读
- javascript - 在加载时根据 html 属性设置背景图像
- c++ - 在旧 Windows 控制台中隐藏滚动条(Windows 10 之前的一个)
- java - 为什么我不能用 java 8 解决最后 2 位乘法的问题?
- azure - Azure REST API:拉取组织的所有订阅?
- php - 通过 PHP 拆分 URL
- python - 在字符串中查找变量的名称,然后将变量名称替换为变量值
- python - ValueError:使用序列Tensorflow和numpy设置数组元素
- cmake - Windows CMake 问题上的 Rust
- javascript - 拦截 XHR - 在提高负载之前运行功能
- reactjs - 相同的 onpress 功能还针对其他 TouchableHighlights