让我们假设我有如下数据:
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))
,但是它可以正常运行,因此我需要创建一个新变量,例如A01
,C01
并保留旧的A
和C
。
答案 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