【问题标题】:R - mutate multiple column values conditionallyR - 有条件地改变多个列值
【发布时间】:2017-02-07 08:16:28
【问题描述】:

使用如下数据框:

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

如果值为"true"FALSE 如果值为"false",则需要将col val1val2 中的值更改为TRUE(R 逻辑真)。

这可以通过

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

虽然上述方法有效,但我有一个列数达到 100 的情况。所以需要一种方法来指定要变异的列 - 就像上面示例中的df[,2:3]。虽然首选基本 R 解决方案,但也欢迎其他解决方案。

【问题讨论】:

  • 我会选择df[-1] &lt;- as.logical(unlist(df[-1]))。查看?TRUE:“as.logical 尝试将其参数强制为逻辑类型。对于因素,这使用级别(标签)。就像 as.vector 一样,它会去除包括名称在内的属性。字符串 c(" T", "TRUE", "True", "true") 为真,c("F", "FALSE", "False", "false") 为假,其他为 NA。”。所以基本上R熟悉"true""false"
  • stackoverflow.com/questions/42084356/…987654321@问了几乎完全相同的问题后,为什么还要为此打开第二个问题
  • 这不是“几乎完全相同的问题”——你为什么这么认为?
  • 你上一个问题是这个问题的一个特例。所以我用这个关闭了它。

标签: r


【解决方案1】:

@DavidArenburg 在评论中的回答以及对 R 如何处理 logicals 的解释需要是一个真正的答案 imo,将其复制并粘贴到此处:

你可以简单地选择

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

查看?TRUE

as.logical 尝试将其参数强制为逻辑类型。对于因素,这使用水平(标签)。就像 as.vector 它剥离 包括名称在内的属性。字符串 c("T", "TRUE", "True", "true") 被认为是真,c("F", "FALSE", "False", "false") 为 false,所有其他为 NA。

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

【讨论】:

    【解决方案2】:

    我们可以使用基础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
    

    【讨论】:

      【解决方案3】:

      我们可以从tidyverse使用mutate_at

      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
      

      【讨论】:

        猜你喜欢
        • 2020-04-24
        • 2021-10-15
        • 2023-02-09
        • 2020-02-10
        • 2021-01-28
        • 2018-11-04
        • 1970-01-01
        • 2018-01-01
        • 2021-07-03
        相关资源
        最近更新 更多