【问题标题】:How to create logical variable based on logical condition?如何根据逻辑条件创建逻辑变量?
【发布时间】:2015-11-07 13:45:00
【问题描述】:

我有一个包含因子变量的数据框

> a <- c("a", "b", "c")
> b <- c("c", "b", "a")
> df <- as.data.frame(cbind(a,b))
> df$a <- as.factor(df$a)
> df$b <- as.factor(df$b)
> df
  a b
1 a c
2 b b
3 c a

我根据 var a 和 var b 的相似性创建新的逻辑变量。

> df$result <- isTRUE(df$a == df$b)

但我得到了结果:

> df
  a b result
1 a c  FALSE
2 b b  FALSE
3 c a  FALSE

当我预料到的时候

> df
  a b result
  1 a c  FALSE
  2 b b  TRUE
  3 c a  FALSE

(我正在使用因子来复制我的真实数据)

我做错了什么?如何实现识别相似变量的目标?谢谢

【问题讨论】:

    标签: r logical-operators


    【解决方案1】:

    做事

    df$result <- with(df, a==b)
    df
    #  a b result
    #1 a c  FALSE
    #2 b b   TRUE
    #3 c a  FALSE
    

    a==b 已经返回一个逻辑向量,我们不需要 isTRUE 来包装它。

    正如 @Frank 在 cmets 中提到的,最好在 character 类列之间进行评估,因为 factor 级别的差异可能会导致错误。我们可以将factor 转换为character 进行评估

     with(df, as.character(a)==as.character(b))
    

    或使两列中的级别相同

     Un1 <- union(levels(df$a), levels(df$b))
     df[] <- lapply(df, factor, levels=Un1)
     with(df, a==b)
    

    【讨论】:

    • 非常感谢@akrun,这行得通! with() 在函数中使用是否可靠?
    • @jpinelo 我想它应该可以工作。我使用with 来避免每次都调用df$。顺便说一句,如果您在函数中使用它,请避免使用 $ 而是使用 [
    • 当然。已经尝试过,但必须从第一个答案开始等待 11 分钟。
    • 值得强调:因素是最坏的。假设您以这种方式到达dfdf = data.frame(a=c("A",a),b=c("a",b))[-1, ]。然后 R 将拒绝评估 with(df, a==b)
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2020-09-08
    • 2023-03-03
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多