2015-05-20 4 views
7

मैं दो डेटा फ्रेम के रूप में निम्नानुसार है:बदलने मूल्यों

0.62m 0.87m 1.12m 1.37m 
25 0.011 0.017 0.009 0.025 
26 0.043 0.018 0.016 0.035 
27 0.057 0.052 0.048 0.035 
28 0.067 0.062 0.030 0.048 
29 0.095 0.111 0.085 0.067 
30 0.121 0.101 0.070 0.074 
31 0.098 0.112 0.108 0.095 
32 0.086 0.096 0.076 0.080 
33 0.103 0.104 0.078 0.082 
34 0.120 0.108 0.092 0.091 
35 0.104 0.111 0.107 0.094 

टेस्ट 2 ऐसा दिखाई देता है:

test1 <- structure(list(`0.62m` = c(0.011, 0.043, 0.057, 0.067, 0.095, 
0.121, 0.098, 0.086, 0.103, 0.12, 0.104), `0.87m` = c(0.017, 
0.018, 0.052, 0.062, 0.111, 0.101, 0.112, 0.096, 0.104, 0.108, 
0.111), `1.12m` = c(0.009, 0.016, 0.048, 0.03, 0.085, 0.07, 0.108, 
0.076, 0.078, 0.092, 0.107), `1.37m` = c(0.025, 0.035, 0.035, 
0.048, 0.067, 0.074, 0.095, 0.08, 0.082, 0.091, 0.094)), .Names = c("0.62m", 
"0.87m", "1.12m", "1.37m"), row.names = 25:35, class = c("tbl_df", 
"tbl", "data.frame")) 

#Test 2 
test2 <- structure(list(`0.62m` = c(235.15, 230.95, 251.95, 261.25, 254.55, 
251.75, 259.85, 257.65, 252.55, 255.55, 254.15), `0.87m` = c(287.95, 
196.35, 275.05, 245.85, 253.35, 259.75, 254.95, 261.75, 253.05, 
264.45, 264.25), `1.12m` = c(36.35, 242.95, 266.65, 266.45, 248.85, 
256.95, 253.75, 268.25, 251.05, 268.85, 259.65), `1.37m` = c(20.65, 
287.95, 260.25, 260.55, 255.25, 258.45, 248.45, 261.95, 253.45, 
263.25, 252.05)), .Names = c("0.62m", "0.87m", "1.12m", "1.37m" 
), row.names = 25:35, class = c("tbl_df", "tbl", "data.frame" 
)) 

टेस्ट 1 ऐसा दिखाई देता

0.62m 0.87m 1.12m 1.37m 
25 235.15 287.95 36.35 20.65 
26 230.95 196.35 242.95 287.95 
27 251.95 275.05 266.65 260.25 
28 261.25 245.85 266.45 260.55 
29 254.55 253.35 248.85 255.25 
30 251.75 259.75 256.95 258.45 
31 259.85 254.95 253.75 248.45 
32 257.65 261.75 268.25 261.95 
33 252.55 253.05 251.05 253.45 
34 255.55 264.45 268.85 263.25 
35 254.15 264.25 259.65 252.05 

अब, मैं एक नया डेटाफ्रेम test3 बनाना चाहता हूं जहां मुझे यह जांचने की आवश्यकता है कि test2 में मान 1 से अधिक है या नहीं 80 या नहीं। यदि मान 180 से अधिक है, तो तत्व test1 के समान होना चाहिए अन्यथा यह -1 * test1 होना चाहिए। एक अन्य विधि

test3 <- ifelse(test2 > 180, test1, -1 * test1) 

:

वांछित ouput निम्नलिखित दिखाई देगा:

0.62m 0.87m 1.12m 1.37m 
25 0.011 0.017 -0.009 -0.025 
26 0.043 0.018 0.016 0.035 

मैं निम्नलिखित की कोशिश की

test3 <- data.frame(sapply(X = test1, FUN = function(x) (ifelse(test2>180, x, - 1*x)))) 

मुझे लगता है कि मैं लागू उपयोग करने की आवश्यकता है, लेकिन सुनिश्चित नहीं है कि इसका सही तरीके से उपयोग कैसे करें।

+2

मुझे लगता है कि आपके डेटा सेट को मेट्रिस में कनवर्ट करने के बाद आपका पहला दृष्टिकोण काम करना चाहिए। –

उत्तर

4

तुम बस कुछ as.matrix() कॉल (ध्यान दें कि शीर्ष पंक्ति में केवल दो सबसे दायीं ओर कोशिकाओं वास्तव में 180 से कम कर रहे) की जरूरत है:

ifelse(as.matrix(test2)>180,as.matrix(test1),-as.matrix(test1)); 
## 0.62m 0.87m 1.12m 1.37m 
## 25 0.011 0.017 -0.009 -0.025 
## 26 0.043 0.018 0.016 0.035 
## 27 0.057 0.052 0.048 0.035 
## 28 0.067 0.062 0.030 0.048 
## 29 0.095 0.111 0.085 0.067 
## 30 0.121 0.101 0.070 0.074 
## 31 0.098 0.112 0.108 0.095 
## 32 0.086 0.096 0.076 0.080 
## 33 0.103 0.104 0.078 0.082 
## 34 0.120 0.108 0.092 0.091 
## 35 0.104 0.111 0.107 0.094 

वापसी मान एक मैट्रिक्स होगा, लेकिन आपके पास वापस कर सकते हैं as.data.frame() के माध्यम से एक डेटा.फ्रेम (यदि आप चाहते हैं)।

+0

इस समाधान के लिए धन्यवाद। आपका दृष्टिकोण मेरी तुलना में अधिक सुरुचिपूर्ण है। –

4

आप

test1*((test2<=180) *-1+ (test2>180)) 
# 0.62m 0.87m 1.12m 1.37m 
#25 0.011 0.017 -0.009 -0.025 
#26 0.043 0.018 0.016 0.035 
#27 0.057 0.052 0.048 0.035 
#28 0.067 0.062 0.030 0.048 
#29 0.095 0.111 0.085 0.067 
#30 0.121 0.101 0.070 0.074 
#31 0.098 0.112 0.108 0.095 
#32 0.086 0.096 0.076 0.080 
#33 0.103 0.104 0.078 0.082 
#34 0.120 0.108 0.092 0.091 
#35 0.104 0.111 0.107 0.094 

या एक और अधिक सुरुचिपूर्ण विकल्प (टिप्पणी में) @Marat Talipov ने सुझाव दिया

test1*((test2>180)*2-1) 
+2

शानदार, @akrun। +1 – bgoldst

+1

या 'test1 * ((test2> 180) * 2-1) ' –

+0

@bgoldst धन्यवाद, मैं पहले' as.matrix' पोस्ट करने का प्रयास कर रहा था, लेकिन फिर मैंने मारतटलिपोव की टिप्पणी देखी। आपका भी अच्छा है – akrun

4

एक अन्य समाधान (वांछित परिणाम test1 में संग्रहीत किया जाएगा) किया जा सकता है की कोशिश कर सकते

indx <- test2 <= 180 
test1[indx] <- -test1[indx] 
+1

एक और शानदार समाधान। –

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