Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace Value in column based on another column With R [duplicate]

I'm trying to replace the value of a column based on the data in a different column, but it's not working. Here's some example data.

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%"))

If the value of Col2 is b, I need to change the value of Col3 to NA or 0 (NA is more accurate, but for what I'm doing, a 0 will also work). Column 3 is percents, I know I used strings here.

I tried doing this a few ways, most recently of which is the loop I have listed below. I'm open to any solution on this though. Is my loop not working because I'm not defining a pattern?

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

print(df)
like image 892
pkpto39 Avatar asked Mar 13 '26 08:03

pkpto39


2 Answers

Here's a base R solution:

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

Here's a dplyr/tidyverse solution:

library(dplyr)    

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

(Original, but less efficient case_when solution)

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

This gives us:

  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%
like image 193
Matt Avatar answered Mar 15 '26 20:03

Matt


A base dplyr solution, using ifelse() instead of 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))
like image 41
Steven Avatar answered Mar 15 '26 21:03

Steven



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!