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_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 来实现目标。任何的意见都将会有帮助。提前致谢。

【问题讨论】:

你可以使用mutate_at(vars(core.vars) 你可以使用sign temp.df %&gt;% 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 [重复] 有条件地将一列中的值替换为另一列中的值

使用 dplyr 有条件地替换列中的值

tidyverse 和 dplyr:根据其他列有条件地替换列中的值

R dplyr 识别一列中的条件序列并改变另一列(或左右)

R中的条件数据框突变与magrittr和dplyr

总结并列出 dplyr 中的自定义索引