根据其他列中的条件更新一列中的值

Posted

技术标签:

【中文标题】根据其他列中的条件更新一列中的值【英文标题】:Update a Value in One Column Based on Criteria in Other Columns 【发布时间】:2015-04-23 10:18:09 【问题描述】:

如果我的数据框 (df) 如下所示:

Name        State
John Smith  MI
John Smith  WI
Jeff Smith  WI

我想将 WI 中的 John Smith 重命名为“John Smith1”。 SQL 语句的最简洁的 R 等效项是什么?

update df 
set Name = "John Smith1"
where Name = "John Smith"
and State = "WI"

【问题讨论】:

可能是这样的? df[df$Name == "John_Smith" & df$State == "WI",1] <- "John_Smith1" RStudent 是正确的,以防你的第一列不属于factor 这几乎可以工作,但我有一个非常大的数据框,所以我试图简化这个问题。您的解决方案将“John_Smith1”添加到我的数据框的第一列,而不是 df$Name 列。 @FrankB。您可以像我在答案中所做的那样将1 更改为Name 【参考方案1】:
df <- data.frame(Name=c('John Smith', 'John Smith', 'Jeff Smith'),
                 State=c('MI','WI','WI'), stringsAsFactors=F)

df <- within(df, Name[Name == 'John Smith' & State == 'WI'] <- 'John Smith1')

> df
         Name State
1  John Smith    MI
2 John Smith1    WI
3  Jeff Smith    WI

** 编辑 **

编辑添加了您可以在 inside 表达式中添加任何您喜欢的内容:

df <- within(df, 
    f <- Name == 'John Smith' & State == 'WI'
    Name[f] <- 'John Smith1'
    State[f] <- 'CA'
) 

【讨论】:

我希望我知道如何经济地更新多个列。此语法似乎需要为要更新的每一列复制子集条件。 within 将表达式作为第二个参数。你可以把任何你想要的东西塞进去。有关示例,请参阅我的更新答案。【参考方案2】:

一种方式:

df[df$Name == "John_Smith" & df$State == "WI", "Name"] <- "John_Smith1"

使用dplyr的另一种方式:

df %>% mutate(Name = ifelse(State == "WI" & Name == "John_Smith", "John_Smith1", Name))

注意:正如 David Arenburg 所说,第一列不应该是一个因素。为此,读取数据集stringsAsFactors = FALSE

【讨论】:

【参考方案3】:

你也可以使用包data.table:

library(data.table)
setDT(df)[State=="WI", Name:=paste0(Name,"1")]

【讨论】:

此代码还会将Jeff Smith 重命名为Jeff Smith1。使用setDT(df)[State == "WI" &amp; Name == "John Smith", Name := paste0(Name, "1")] 仅将John SmithWI 重命名。【参考方案4】:

由于 OP 有 mentioned 他有“一个非常大的数据框”,因此使用二分搜索可能是有利的

library(data.table)
setDT(DF)[.("John Smith",  "WI"), on = .(Name=V1, State=V2), 
          Name := paste0(Name, 1)][]
          Name State
1:  John Smith    MI
2: John Smith1    WI
3:  Jeff Smith    WI

而不是矢量扫描

setDT(df)[State == "WI" & Name == "John Smith", Name := paste0(Name, "1")]

在这两种变体中,数据对象都是通过引用更新的,即不复制整个对象,从而节省时间和内存。

【讨论】:

以上是关于根据其他列中的条件更新一列中的值的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

PSQL - 查找所有值并根据另一列中的非唯一值使其唯一

根据另一列中的值从一列中减去值(SQL)

根据c =字符数替换列中的值

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

R:一次根据一列中的条件将整行推送到NA