R - 有条件地改变多个列值

时间:2017-02-07 08:16:28

标签: r

使用如下数据框:

set.seed(100)
df <- data.frame(id = sample(1:5, 6, replace = TRUE),
                 val1 = rep(c("true", "false"), 3), 
                 val2 = sample(c("true", "false"), 6, replace = TRUE))

  id  val1  val2
1 31  true false
2 26 false  true
3 56  true false
4  6 false  true
5 47  true false
6 49 false false

如果值为val1,则需要将列val2TRUE中的值更改为"true"(R逻辑真值),如果值为{FALSE,则需要将值更改为"false" {1}}。

这可以通过

完成
df$val1 <- df$val1 == "true"
df$val2 <- df$val2 == "true"

虽然上面的工作原理,我的情况是列数达到100s。因此,需要一种方法来指定要变异的列 - 例如上面示例中的df[,2:3]。虽然基础R解决方案是首选,但欢迎其他人使用。

3 个答案:

答案 0 :(得分:5)

@DavidArenburg在评论中的答案,解释R如何处理logical需要成为一个真正的答案imo,复制并粘贴在这里:

您可以简单地使用

df[-1] <- as.logical(unlist(df[-1]))

查看?TRUE

  

as.logical试图强迫其参数为逻辑类型。对于因子,这使用级别(标签)。像as.vector一样剥离   属性包括名称。字符串c(“T”,“TRUE”,“True”,   “true”)被视为真,c(“F”,“FALSE”,“False”,“false”)as   false,其他所有人都是NA。

所以基本上R熟悉"true""false"并知道如何处理它们

答案 1 :(得分:4)

我们可以使用基础R

df[, 2:3] <- df[, 2:3] == "true"

df
#  id  val1  val2
#1  2  TRUE FALSE
#2  2 FALSE  TRUE
#3  3  TRUE FALSE
#4  1 FALSE  TRUE
#5  3  TRUE FALSE
#6  3 FALSE FALSE

答案 2 :(得分:2)

我们可以使用mutate_at

中的tidyverse
library(tidyverse)
library(magrittr)
df %<>%
     mutate_at(vars(val1:val2), funs(.=="true"))
df
#  id  val1  val2
#1  2  TRUE FALSE
#2  2 FALSE  TRUE
#3  3  TRUE FALSE
#4  1 FALSE  TRUE
#5  3  TRUE FALSE
#6  3 FALSE FALSE

另一个选项是data.table

library(data.table)
setDT(df)[, (2:3) := lapply(.SD, `==`, "true"), .SDcols = 2:3]

或者有效的base R方法

df[-1] <- lapply(df[-1], `==`, "true")
df
#  id  val1  val2
#1  2  TRUE FALSE
#2  2 FALSE  TRUE
#3  3  TRUE FALSE
#4  1 FALSE  TRUE
#5  3  TRUE FALSE
#6  3 FALSE FALSE