使用mutate_if创建新列

时间:2018-07-03 18:57:04

标签: r dplyr

让我们假设我有如下数据:

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

1 个答案:

答案 0 :(得分: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