【问题标题】:R: Filtering and mutating a data frame WITH replacementR:使用替换过滤和改变数据框
【发布时间】:2020-06-05 15:31:22
【问题描述】:

我正在尝试选择所有高于 3.0 的 TRUE 值并将 TF 列替换为 FALSE。我可以这样做,但无法在原始数据框中替换它。有什么建议吗?

df <- data.frame("TF" = c("TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "FALSE"),
                 "Number" = c(4.0, 4.0, 3.0, 2.5, 3.0, 1.0))


df %>%
  filter(TF == TRUE) %>%
  filter(Number <= 3) %>%
  mutate(TF = FALSE)

最终的数据框应该是:

"TF" = c("TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE")

"数字" = c(4.0, 4.0, 3.0, 2.5, 3.0, 1.0)

【问题讨论】:

  • 你遇到了什么麻烦?
  • 你真的不想filter两次然后mutate,你想mutate基于一些ifelse逻辑的TF列。

标签: r dplyr


【解决方案1】:

怎么样:

df%>% mutate(TF = as.logical(TF))%>% mutate(TF = ifelse(TF & Number <= 3.0, F, TF)

【讨论】:

    【解决方案2】:

    Base R 可能是你更好的选择

    df[df$TF & df$Number <= 3, "TF"] <- FALSE
    

    如果你真的喜欢 tidyverse

    mutate(df, TF = if_else(TF & (Number <=3), FALSE, TF))
    

    【讨论】:

    • 我更喜欢使用 Tidyverse,因为我的其余代码都在使用它,但上面的示例似乎对我不起作用。 (错误:& 对因子没有意义)
    • 您的“TRUE 不是 TRUE,这是 Marcus 所依赖的。
    • 在您对df 的定义中,不要引用TRUE 和FALSE。 data.frame 将这些作为字符串读取,如果您使用的是 4.0 之前的 R 版本,它会将这些转换为因子。
    • 是的,我正在运行 R 版本 3.6.3 (2020-02-29),我将更改为逻辑
    【解决方案3】:

    使用dplyr

    library(dplyr)
    
    
    df <- data.frame("TF" = c("TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "FALSE"),
                     "Number" = c(4.0, 4.0, 3.0, 2.5, 3.0, 1.0))
    
    
    df <- df %>%
      mutate(TF = as.character(TF)) %>%
      mutate(TF = if_else(TF == "TRUE" & Number <= 3, "FALSE", TF))
    
    df
    
    df
    #>      TF Number
    #> 1  TRUE    4.0
    #> 2 FALSE    4.0
    #> 3 FALSE    3.0
    #> 4 FALSE    2.5
    #> 5 FALSE    3.0
    #> 6 FALSE    1.0
    

    【讨论】:

    • 当我运行它时,我得到这个响应:错误:false must be a character vector, not a factor object
    • 我对其进行了编辑,但这意味着您的示例与您所说的不太一样。
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2023-02-04
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多