Изменение значений столбца для каждого уникального значения на основе условия - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть набор данных, в котором мне нужно изменить значения одного столбца на основе условия.

columna columnb 
Y123    B
Y123    A
Y123    T
Y124    B
Y124    A
Y124    T
Y125    A
Y126    A

Я пытаюсь написать для l oop (или проще), чтобы выполнить итерацию по columna и для каждого уникального значения, если B и T отсутствуют, такие как значения Y125 и Y126, замените A на T

for(ii in 1:length(unique(data$columna)){
  if (data$columnb != "B" & data$columnb != "T"){
    marketf$columnb = "T"
  }
}

Я полагаю, это выглядит совершенно неправильно, но я пробовал много вещей, включая каждый и другие циклы, но на самом деле ничего не получалось.

1 Ответ

2 голосов
/ 12 февраля 2020

После группировки по 'columna' мы можем replace значения 'columnb', где количество отдельных элементов меньше 3 и равно от 'A' до 'T'

library(dplyr)
df1 %>% 
   group_by(columna) %>%
   mutate(columnb = replace(columnb, n_distinct(columnb) <3 & 
                              columnb =='A', 'T'))
# A tibble: 8 x 2
# Groups:   columna [4]
#  columna columnb
#  <chr>   <chr>  
#1 Y123    B      
#2 Y123    A      
#3 Y123    T      
#4 Y124    B      
#5 Y124    A      
#6 Y124    T      
#7 Y125    T      
#8 Y126    T      

Если мы специально ищем 'B' и 'T'

df1 %>%
    group_by(columna) %>%
    mutate(columnb = replace(columnb, !any(c('B', 'T') %in% columnb)
           & columnb == 'A',  'T'))
# A tibble: 8 x 2
# Groups:   columna [4]
#  columna columnb
#  <chr>   <chr>  
#1 Y123    B      
#2 Y123    A      
#3 Y123    T      
#4 Y124    B      
#5 Y124    A      
#6 Y124    T      
#7 Y125    T      
#8 Y126    T    

data

df1 <- structure(list(columna = c("Y123", "Y123", "Y123", "Y124", "Y124", 
"Y124", "Y125", "Y126"), columnb = c("B", "A", "T", "B", "A", 
"T", "A", "A")), class = "data.frame", row.names = c(NA, -8L))
...