#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]