R | Изменение элемента в столбце на основе условия в другом столбце

#r

#r

Вопрос:

Это может быть основной вопрос, поэтому заранее извиняюсь. У меня есть база данных со следующими столбцами

 Name   Subject   Marks   Check
Mark   English   45      P
Susan  English   23      F
Gerald Math      33      P
  

Я хочу добавить 10 к значению в столбце «Метки», если Check == ‘F’. Таких строк много, поэтому я не хочу применять цикл for

Ответ №1:

В base R , мы можем использовать простой арифметический подход для обновления

 df$Marks <- with(df, (Check == 'F') * 10   Marks)
  

Или создайте логическое условие в base R и выполните назначение

 i1 <- df$Check == 'F'
df$Marks[i1] <- df$Marks[i1]   10
  

-вывод

 df
#    Name Subject Marks Check
#1   Mark English    45     P
#2  Susan English    33     F
#3 Gerald    Math    33     P
  

Или, в data.table некотором смысле, операция присваивания более проста, поскольку общий синтаксис data.table [i, j, by] — это то, где i может быть целочисленный индекс или логическое условие. Здесь мы указываем логическое условие ( Check == 'F' ) , указываем j ( Marks 10 ) и присваиваем ( := ) его тому же столбцу. Исходный data.frame преобразуется в data.table с setDT

 library(data.table)
setDT(df)[Check == 'F', Marks := Marks   10]
  

Вычисление происходит слева направо, т.Е. Сначала оно преобразуется в data.table ( setDT ) , вычисляет i , выполняет присваивание выражения ( Marks 10 ) в столбце ‘Marks’


Или с dplyr

 library(dplyr)
df %>%
      mutate(Marks = case_when(Check == 'F' ~ Marks   10L, TRUE ~ Marks))
  

данные

 df <- structure(list(Name = c("Mark", "Susan", "Gerald"), Subject = c("English", 
"English", "Math"), Marks = c(45L, 23L, 33L), Check = c("P", 
"F", "P")), class = "data.frame", row.names = c(NA, -3L))
  

Ответ №2:

Вы также можете использовать ifelse() :

 #Base R sol
df$Marks <- ifelse(df$Check=='F',df$Marks 10,df$Marks)
  

Вывод:

     Name Subject Marks Check
1   Mark English    45     P
2  Susan English    33     F
3 Gerald    Math    33     P