R:dplyr条件汇总并按列重新编码值

问题描述 投票:1回答:1

我想根据该列的摘要统计信息(例如,该列的中位数)在选定的列中重新编码以下值。例如,如果单元格值中位数(df $ variable)= 2,则以下core.vars定义的变量数据集,并将其余变量保留在数据框中。

我已经尝试了多种方法来实现这一目标。使用case_whenmutatesummarise_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来实现目标。任何的意见都将会有帮助。预先感谢。

r dplyr mutate case-when summarize
1个回答
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(.)))
© www.soinside.com 2019 - 2024. All rights reserved.