在整个数据集而不是单个列上使用ifelse语句

时间:2018-09-17 19:54:12

标签: r

我正在尝试在整个数据帧而不是单个列上使用ifelse。

如果我的数据是这样的

Var1     Var2     Var3
 1        1        1
 3        2        0
 0        1        2
 3        3        1
 5        0        3 

要更改各个列,我会做完

Var1_Binary<-ifelse(data$Var1 == 0, 0, 1)
Var2_Binary<-ifelse(data$Var2 == 0, 0, 1)
Var3_Binary<-ifesle(data$Var3 == 0, 0, 1)

但是我想对整个数据集进行ifelse-我有很多变量,对每个数据集进行ifelse会很费时间。

因此,最终的数据集看起来像这样

Var1     Var2     Var3
 1        1        1
 1        1        0
 0        1        1
 1        1        1
 1        0        1 

非常感谢您!

4 个答案:

答案 0 :(得分:2)

你可以做

DF[] <- as.integer(DF > 0)
DF
#  Var1 Var2 Var3
#1    1    1    1
#2    1    1    0
#3    0    1    1
#4    1    1    1
#5    1    0    1

如果您想扩展数据框,请尝试

DF[paste0(names(DF), "_Binary")] <- as.integer(DF > 0)
DF
#  Var1 Var2 Var3 Var1_Binary Var2_Binary Var3_Binary
#1    1    1    1           1           1           1
#2    3    2    0           1           1           0
#3    0    1    2           0           1           1
#4    3    3    1           1           1           1
#5    5    0    3           1           0           1

数据

DF <- structure(list(Var1 = c(1L, 3L, 0L, 3L, 5L), Var2 = c(1L, 2L, 
1L, 3L, 0L), Var3 = c(1L, 0L, 2L, 1L, 3L)), .Names = c("Var1", 
"Var2", "Var3"), row.names = c(NA, -5L), class = "data.frame")

答案 1 :(得分:2)

使用lapply

data.frame(lapply(df, function(x) as.integer(x != 0)))

数据:

df <- data.frame(
    var1 = c(1,3,0,3,5),
    var2 = c(1,2,1,4,0),
    var3 = c(1,0,2,1,3)
)

答案 2 :(得分:1)

dplyr方法:

library(dplyr)

data %>%
  mutate_all(funs(ifelse(. == 0, 0, 1)))

# or...
data %>%
  mutate_all(funs(as.integer(. > 0)))

答案 3 :(得分:1)

以下是在每列上使用ifelse的另一种解决方案:

data.frame(Map(ifelse, list(df==0), 0, 1))

  var1 var2 var3
1    1    1    1
2    1    1    0
3    0    1    1
4    1    1    1
5    1    0    1