R:dplyr 有条件地汇总并重新编码列中的值
Posted
技术标签:
【中文标题】R:dplyr 有条件地汇总并重新编码列中的值【英文标题】:R: dplyr conditional summarize and recode values in the column wise 【发布时间】:2020-09-11 12:42:42 【问题描述】:我想根据列的汇总统计信息(例如列的中值)重新编码选定列中的以下值。例如如果单元格值中值(df$variable)=2。以下变量由core.vars中定义数据集,并将其余变量保留在数据框中。
我尝试了多种方法来实现这一点。使用case_when
、mutate
、summarise_each
,结果不成功。原始数据集包含数百列和行,因此我想选择列并尽量简洁。
temp.df <- as.tibble (mtcars)
other.vars <- c('hp', 'drat', 'wt')
core.vars <- c('mpg', 'cyl', 'disp')
temp.df <- rownames_to_column (temp.df, var ="cars_id")
temp.df <- temp.df %>% mutate_if (is.integer, as.numeric)
尝试 1:
`temp.df <- temp.df %>% mutate_at(.vars %in% (core.vars)), funs (
lookupvariable <- temp.df %>% pull (quo_name(quo(.))) #extract column name
ifelse(is.na(.), lookup_value, .)),
function (x) case_when (
x < median(lookupvariable) ~ 1,
x == median(lookupvariable) ~ 0,
x > median(lookupvariable) ~ 2
))`
Extract column name in mutate_if call
尝试 2:
`temp.df <- temp.df %>% mutate_at(.vars %in% (core.vars)), function (x) case_when (
x < summarise_each (list (median)) ~ 1,
x == summarise_each (list (median)) ~ 0,
x > summarise_each (list (median)) ~ 2
))`
这不起作用,因为传递给汇总的数据不是向量
论坛上以前的问题包括如何对单个变量执行此操作,但是我有 100 个变量和 300 个样本,因此不能逐行单独输入它们。我查看了以下解决方案,但它们都略有不同。
Using dplyr to group_by and conditionally mutate only with if (without else) statement
Using dplyr summarise with conditions
dplyr conditional summarise function
Mean of column based on multiple conditions in R
R: Recoding variables using recode, mutate and case_when
理想情况下,最好不要创建单独的数据框然后进行连接,或者像 mutate 那样创建多个单独的变量。我确信有一个 for 循环和/或 ifelse 方法,但试图使用 tidyverse 来实现目标。任何的意见都将会有帮助。提前致谢。
【问题讨论】:
你可以使用mutate_at(vars(core.vars)
你可以使用sign
temp.df %>% mutate_at(vars(core.vars), ~ sign(. - median(.)))
【参考方案1】:
使用mutate_at
,它正在创建/修改列
library(dplyr)
temp.df %>%
mutate_at(vars(core.vars), ~
md <- median(.)
case_when(. < md ~ 1, . == md ~ 0, . > md ~ 2))
没有casewhen
也可以更改值
temp.df %>%
mutate_at(vars(core.vars), ~ sign(. - median(.)))
【讨论】:
以上是关于R:dplyr 有条件地汇总并重新编码列中的值的主要内容,如果未能解决你的问题,请参考以下文章
使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值