使用如下数据框:
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
,则需要将列val2
和TRUE
中的值更改为"true"
(R逻辑真值),如果值为{FALSE
,则需要将值更改为"false"
{1}}。
这可以通过
完成df$val1 <- df$val1 == "true"
df$val2 <- df$val2 == "true"
虽然上面的工作原理,我的情况是列数达到100s。因此,需要一种方法来指定要变异的列 - 例如上面示例中的df[,2:3]
。虽然基础R解决方案是首选,但欢迎其他人使用。
答案 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