Изменение значений столбца в зависимости от того, удовлетворяет ли другой столбец критериям

#r #dataframe

#r #фрейм данных

Вопрос:

Я хочу вычесть 1 из значений столбца A, если столбец B равен <= 20.

 A = c(1,2,3,4,5)
B = c(10,20,30,40,50)
df = data.frame(A,B)
  

вывод

   A  B
1 0 10
2 1 20
3 3 30
4 4 40
5 5 50
  

Мои данные очень велики, поэтому я предпочитаю не использовать цикл. Существует ли какой-либо вычислительно эффективный метод в R?

Ответ №1:

Вы можете сделать

 df$A[df$B <= 20]  <- df$A[df$B <= 20] - 1

#  A  B
#1 0 10
#2 1 20
#3 3 30
#4 4 40
#5 5 50
  

Мы можем разбить это шаг за шагом, чтобы понять, как это работает.

Сначала мы проверяем, какие числа в B меньше 20, что дает нам логический вектор

 df$B <= 20
#[1]  TRUE  TRUE FALSE FALSE FALSE
  

Используя этот логический вектор, мы можем выбрать числа в A

 df$A[df$B <= 20]
#[1] 1 2
  

Вычтите 1 из этих чисел

 df$A[df$B <= 20] - 1
#[1] 0 1
  

и замените эти значения для тех же индексов в A .


С dplyr мы также можем использовать case_when

 library(dplyr)

df %>%
  mutate(A = case_when(B <= 20 ~ A - 1, 
                       TRUE ~ A))
  

Ответ №2:

Другая возможность:

 df$A <- ifelse(df$B < 21, df$A - 1, df$A)
  

Ответ №3:

И вот data.table решение:

 library(data.table)
setDT(df)
df[B <= 20, A := A - 1]