【问题标题】:Create new columns with mutate_if [duplicate]使用 mutate_if 创建新列 [重复]
【发布时间】:2018-12-12 03:58:34
【问题描述】:

假设我有如下数据:

structure(list(A = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8), B = c(0, 1, 1, 0, 0, 1, 4, 9.2, 9, 0, 0, 1), C = c(2, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 8)), .Names = c("A", "B", "C"), row.names = c(NA, -12L), class = "data.frame")

现在我想为这些列创建虚拟变量,其中 0 的比例大于0.5。如果原始列中有0,则这些虚拟变量的值为0,如果相反,则为1。我怎样才能用dplyr 做到这一点?我在想data %>% mutate_if(~mean(. == 0) > .5, ~ifelse(. == 0, 0, 1)),但这是在原地运行,我需要创建名为例如的新变量。 A01C01 并保留旧的 AC

【问题讨论】:

  • 试试df1 %>% mutate_if(~mean(. == 0) > .5, funs("01" = ifelse(. == 0, 0, 1)))
  • 工作完美,谢谢!

标签: r dplyr


【解决方案1】:

我们用funs 包装并给出一个不同的名称,该名称将作为后缀附加

library(dplyr)
library(stringr)
df1 %>% 
   mutate_if(~mean(. == 0) > .5, funs(`01` = ifelse(. == 0, 0, 1))) %>%
   rename_all(str_remove, "_")
#   A   B C A01 C01
#1  0 0.0 2   0   1
#2  0 1.0 9   0   1
#3  0 1.0 0   0   0
#4  0 0.0 0   0   0
#5  0 0.0 0   0   0
#6  0 1.0 9   0   1
#7  0 4.0 0   0   0
#8  0 9.2 0   0   0
#9  0 9.0 0   0   0
#10 0 0.0 0   0   0
#11 1 0.0 0   1   0
#12 8 1.0 8   1   1

在较新版本的dplyr中,我们可以使用mutateacross

df1 %>%
   mutate(across(where(~ mean(. == 0) > .5), 
          ~ as.integer(. != 0), .names = '{.col}01'))

【讨论】:

  • funs() 在 dplyr 0.8.0 中已弃用。现在您需要使用命名函数。 df1 %>% mutate_if(~mean(. == 0) > .5, list(suffix = function(.) {ifelse(. == 0, 0, 1)} ))
  • @user1582665 谢谢,我添加了大部分是最新的across
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2018-03-18
  • 2021-11-12
相关资源
最近更新 更多