2011-10-12 19 views
11

के बीच मूल्यों को स्वैप कैसे करें मेरे पास 3 चर और 250 के रिकॉर्ड के साथ डेटाफ्रेम है। एक उदाहरण के रूप पर विचार2 कॉलम

> df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
V1 V2 V3 
1 a 2 
2 a 3 
4 b 1 

और इस प्रकार V2 के मूल्य के आधार V1 और वी 3 के बीच मूल्यों स्वैप करने के लिए चाहते हैं: V2 == 'b' फिर अगर V1 <- V3 और V3 <- V1

V1 V2 V3 
1 a 2 
2 a 3 
1 b 4 

में जिसके परिणामस्वरूप मैं एक करते हैं की कोशिश की पाश लेकिन यह हमेशा के लिए लेता है। अगर मैं पर्ल का उपयोग करता हूं, तो इसमें सेकंड लगते हैं। मेरा मानना ​​है कि यह कार्य आर में भी कुशलता से किया जा सकता है। किसी भी सुझाव की सराहना की जाती है।

+0

मुझे उत्सुकता है कि यह स्थिति कैसे आई, अगर आप मुझसे पूछने पर ध्यान नहीं देते हैं। मेरे पास सॉफ़्टवेयर का उपयोग करने का कुछ अनुभव है जो सर्वेक्षण डेटा के साथ काम करने के लिए कम से कम डिज़ाइन किया गया है, लेकिन जैसा कि हम आईटी डेटाबेस के साथ एकीकृत करने की प्रवृत्ति का पालन करते हैं, डेटा संरचना के प्रश्न उठने लगे हैं और मुझे जागरूक तरीके से सोचने की आवश्यकता है हम टेबल में सामान स्टोर करते हैं। यही कारण है कि मैं उत्सुक हूं कि आपकी स्थिति कैसे आई :) :) – Jonathan

उत्तर

4

संपादित मुझे कॉलम नामों के साथ फिसल गया, क्षमा करें। यह काम।

आप पंक्तियों अलग आदेश में समाप्त कोई आपत्ति नहीं है, यह एक 'प्यारा' तरीका यह है की तरह है:

dat <- read.table(textConnection("V1 V2 V3 
1 a 2 
2 a 3 
4 b 1"),sep = "",header = TRUE) 

tmp <- dat[dat$V2 == 'b',3:1] 
colnames(tmp) <- colnames(dat) 
rbind(dat[dat$V2 != 'b',],tmp) 

असल में, कि बस पंक्तियों जहां V2 == 'b' हथियाने है, पराजयों कॉलम और इसे सब कुछ के साथ एक साथ वापस slaps। यदि आपके पास अधिक कॉलम हैं जिन्हें स्विचिंग की आवश्यकता नहीं है, तो इसे बढ़ाया जा सकता है; आप केवल 3:1 की बजाय, उन मानों के साथ एक पूर्णांक अनुक्रमणिका का उपयोग करेंगे।

+0

यह करने का यह एक शानदार तरीका है! +1 – Chris

14

इस

> df <- data.frame(V1=c(1,2,4), V2=c("a","a","b"), V3=c(2,3,1)) 
> df[df$V2 == "b", c("V1", "V3")] <- df[df$V2 == "b", c("V3", "V1")] 
> df 
    V1 V2 V3 
1 1 a 2 
2 2 a 3 
3 1 b 4 
+0

साफ समाधान! +1। – TMS

10

प्रयास करें आप transform उपयोग कर सकते हैं यह करने के लिए।

df <- transform(df, V3 = ifelse(V2 == 'b', V1, V3), V1 = ifelse(V2 == 'b', V3, V1)) 
+0

मैं x = read.table ("1.txt") x <- ट्रांसफॉर्म (x, x [[1]] <- ifelse (x [[1]]> x [[2]], x [[2]], एक्स [[1]]), एक्स [[2]] <- ifelse (x [[1]]> x [[2]], x [[1]], x [[2] ])) लेकिन कोई सफलता नहीं! – phoenix

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