如果我的数据框(df)如下所示:
Name State
John Smith MI
John Smith WI
Jeff Smith WI
我想从WI“约翰史密斯1”重命名约翰史密斯。什么是SQL语句中最干净的R等价物?
update df
set Name = "John Smith1"
where Name = "John Smith"
and State = "WI"
答案 0 :(得分:21)
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
答案 1 :(得分:10)
一种方式:
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
。
答案 2 :(得分:2)
您还可以使用包data.table
:
library(data.table)
setDT(df)[State=="WI", Name:=paste0(Name,"1")]
答案 3 :(得分:0)
由于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")]
在两种变体中,数据对象都通过引用更新,即不复制整个对象,节省了时间和内存。