#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