【问题标题】:Replace Value in column based on another column With R [duplicate]用R替换基于另一列的列中的值[重复]
【发布时间】:2021-05-10 05:11:39
【问题描述】:

我正在尝试根据不同列中的数据替换列的值,但它不起作用。这是一些示例数据。

df <- data.frame(Col1 = 1:10,
                 Col2 = c("a", "a", "a", "b", "b", "c", "c", "d", "d", "d"),
                 Col3 = c("11%", "12%", "13%", "14%", "15%", "16%", "17%", "18%", "19%", "20%"))

如果 Col2 的值为 b,我需要将 Col3 的值更改为 NA 或 0(NA 更准确,但对于我正在做的事情,0 也可以)。第 3 列是百分比,我知道我在这里使用了字符串。

我尝试了几种方法,最近的方法是我在下面列出的循环。不过,我愿意接受任何解决方案。我的循环不工作是因为我没有定义模式吗?

for(i in df){
  if(df$Col2 == "b"){
    str_replace(df$Col3, replacement = NA)
  }
}

print(df)

【问题讨论】:

    标签: r data-manipulation data-cleaning


    【解决方案1】:

    这是base R 解决方案:

    df$Col3[df$Col2 == 'b'] <- NA
    

    这是dplyr/tidyverse 解决方案:

    library(dplyr)    
    
    df %>% mutate(Col3 = ifelse(Col2 == 'b',NA_character_,Col3))
    

    (原创,但效率较低的case_when 解决方案)

    df %>% 
      mutate(Col3 = case_when(Col2 == 'b' ~ NA_character_,
                              TRUE ~ Col3))
    

    这给了我们:

      Col1 Col2 Col3
    1     1    a  11%
    2     2    a  12%
    3     3    a  13%
    4     4    b <NA>
    5     5    b <NA>
    6     6    c  16%
    7     7    c  17%
    8     8    d  18%
    9     9    d  19%
    10   10    d  20%
    

    【讨论】:

    • 虽然我已经使用dplyr 很多年了,但我之前从未见过case_when()。感谢分享。对于初学者来说不像ifelse()那么直观,但仍然非常方便了解。
    • 没问题!我编辑到ifelse 就在你做的时候,这绝对更有效率。
    【解决方案2】:

    一个基本的dplyr 解决方案,使用ifelse() 而不是case_when()

    library(dplyr)
    
    df <- data.frame(Col1 = 1:10,
                     Col2 = c("a", "a", "a", "b", "b", "c", "c", "d", "d", "d"),
                     Col3 = seq(.11, .2, by = .1))
    
    df %>%
      mutate(Col3 = ifelse(Col2 == 'b', NA, Col2))
    

    【讨论】:

      【解决方案3】:

      pkpto39,

      试试这个:

      library('tidyverse')
      df <- data.frame(Col1 = 1:10,
                       Col2 = c("a", "a", "a", "b", "b", "c", "c", "d", "d", "d")
                       Col3 = c("11%", "12%", "13%", "14%", "15%", "16%", "17%", "18%", "19%", "20%"), stringsAsFactors = FALSE)
      
      df <- df %>% mutate(Col3 = ifelse(Col2 == "b", NA, Col3))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        相关资源
        最近更新 更多