2015-02-21 34 views
12

Nếu khung dữ liệu của tôi (df) trông như thế này:Cập nhật một giá trị trong một cột dựa trên tiêu chí trong Cột khác

Name  State 
John Smith MI 
John Smith WI 
Jeff Smith WI 

Tôi muốn đổi tên John Smith từ WI "John Smith1". Tương đương R sạch nhất của câu lệnh SQL là gì?

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

Có thể như thế này? 'df [df $ Name ==" John_Smith "& df $ State ==" WI ", 1] <-" John_Smith1 "' – DatamineR

+0

RStudent là đúng, trong trường hợp cột đầu tiên của bạn không thuộc lớp 'factor' –

+0

hầu hết các công trình, nhưng tôi có một khung dữ liệu rất lớn vì vậy tôi đã cố gắng đơn giản hóa câu hỏi. Giải pháp của bạn thêm "John_Smith1" vào cột đầu tiên trong khung dữ liệu của tôi, chứ không phải cột df $ Name. –

Trả lời

14
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 
5

Một cách:

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

Một cách khác để sử dụng dplyr:

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

Lưu ý: Khi David Arenburg nói, cột đầu tiên không phải là một yếu tố. Đối với điều này, đọc tập dữ liệu stringsAsFactors = FALSE.

2

Bạn cũng có thể sử dụng gói data.table:

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

Mã này cũng sẽ đổi tên 'Jeff Smith' thành' Jeff Smith1'. Sử dụng 'setDT (df) [State ==" WI "& Name ==" John Smith ", Tên: = paste0 (Tên," 1 ")]' để đổi tên chỉ 'John Smith' từ' WI'. – Uwe

0

Như OP có mentioned rằng ông đã "một khung dữ liệu rất lớn", nó có thể là thuận lợi để sử dụng tìm kiếm nhị phân

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 

thay vì một vector quét

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

Trong cả hai biến thể các đối tượng dữ liệu được cập nhật bằng cách tham khảo, nghĩa là không phải sao chép toàn bộ đối tượng mà tiết kiệm thời gian và bộ nhớ.

Các vấn đề liên quan