2015-02-21 14 views
12

में मानदंडों के आधार पर एक कॉलम में एक मान अपडेट करें:अन्य कॉलम

Name  State 
John Smith MI 
John Smith WI 
Jeff Smith WI 

मैं WI "जॉन Smith1" से जॉन स्मिथ नाम बदलना चाहते हैं। एसक्यूएल कथन के सबसे साफ आर बराबर क्या है?

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

शायद यह पसंद है? 'डीएफ [डीएफ $ नाम ==" जॉन_Smith "और डीएफ $ राज्य ==" डब्ल्यूआई ", 1] <-" जॉन_Smith1 "' – DatamineR

+0

आरएसयूडेंट सही है, अगर आपका पहला कॉलम वर्ग 'कारक' –

+0

नहीं है लगभग काम करता है, लेकिन मेरे पास एक बहुत बड़ा डेटा फ्रेम है इसलिए मैं सवाल को सरल बनाने की कोशिश कर रहा था। आपका समाधान "डेटा_Smith1" को मेरे डेटा फ्रेम के पहले कॉलम में जोड़ता है, डीएफ $ नाम कॉलम नहीं। –

उत्तर

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

एक ही रास्ता:

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

नोट::

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

एक अन्य का उपयोग कर dplyr रास्ता डेविड Arenburg कहते हैं, पहले कॉलम एक कारक नहीं होना चाहिए। इसके लिए, डेटा सेट stringsAsFactors = FALSE पढ़ना।

2

तुम भी पैकेज data.table उपयोग कर सकते हैं:

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

उत्तर में किए गए '1'' को 'नाम' में बदल सकते हैं। यह कोड 'जेफ स्मिथ' को 'जेफ स्मिथ 1' का नाम भी देगा। 'सेटडीटी (डीएफ) [राज्य == "डब्ल्यूआई" और नाम == "जॉन स्मिथ", नाम: = पेस्ट 0 (नाम, "1")] का उपयोग करें' वाई 'से केवल' जॉन स्मिथ 'का नाम बदलें। – Uwe

0

ओ पी के रूप में 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")] 

स्कैन दोनों रूपों डेटा ऑब्जेक्ट संदर्भ द्वारा अद्यतन किया जाता है, अर्थात में, पूरी वस्तु जो समय और स्मृति को बचाने कॉपी किए बिना।

संबंधित मुद्दे