首页 > 解决方案 > 右 | 根据另一列中的条件更改列中的元素

问题描述

这可能是一个基本问题,所以事先道歉。我有一个包含以下列的数据库

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

如果 Check == 'F',我想将 10 添加到“标记”列中的值。有很多这样的行,所以我不想应用 for 循环

标签: r

解决方案


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.tablewithsetDT

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

评估从左到右进行,即首先它转换为 data.table ( setDT),评估,对 'Marks' 列i上的表达式 () 进行赋值Marks + 10


或与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))

推荐阅读