2011-12-05 22 views
7

मैं इस एकएक डेटा फ्रेम

1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K 

मैं एक ही मूल्य, यानी कश्मीर के साथ सभी स्तंभों को निकालना चाहते हैं की तरह एक डेटा फ्रेम मिल गया है से एक ही मूल्य के साथ कॉलम निकाल, इसलिए मेरे परिणाम तरह होगा यह

1 1 1 1  
2 1 2 1 
3 8 3 1 
4 8 2 1 
1 1 1 1 
2 1 2 1 

मैं स्तंभों के लिए एक में फिर से प्रयास करने की कोशिश करता हूं लेकिन मुझे कुछ भी नहीं मिला है। कोई विचार?

uniquelength <- sapply(d,function(x) length(unique(x))) 
d <- subset(d, select=uniquelength>1) 

: अग्रिम

+0

क्या संख्यात्मक संख्या के साथ-साथ वर्ण/कारकों के लिए समाधान खाता होना चाहिए? –

+0

हाँ, यह सही है, – user976991

उत्तर

4

में धन्यवाद एक से अधिक मूल्य के साथ कॉलम प्रकार की परवाह किए बिना चयन करने के लिए?

(ओह, रोमन के सवाल का सही है - यह अपने कॉलम 5 के रूप में अच्छी तरह से बाहर दस्तक सकता है)

हो सकता है कि (संपादित: टिप्पणी के लिए धन्यवाद)

isfac <- sapply(d,inherits,"factor") 
d <- subset(d,select=!isfac | uniquelength>1) 

या

d <- d[,!isfac | uniquelength>1] 
+0

आपका सबसेटिंग मेरे लिए काम नहीं करती है। शायद 'डी [,! Isfac | अनन्य तरंग! = 1] '? –

+0

यह मेरे लिए काम नहीं करता है! मैं बिल्कुल वही – user976991

+0

देखता हूं ... अब मुझे "याद है" ('? सबसेट'),' subset' _rows_ पर काम करता है। इसे रोकने के लिए, किसी को 'चयन' स्पष्ट रूप से निर्दिष्ट करना चाहिए, इसलिए 'सबसेट (डी, चयन =! Isfac | uniquelength> 1) '। @ user976991, इसे आज़माएं। –

1

ऐसा करने का एक और तरीका उच्च आदेश फ़ंक्शन Filter का उपयोग कर रहा है। यहाँ कोड

to_keep <- function(x) any(is.numeric(x), length(unique(x)) > 1) 
Filter(to_keep, d) 
3

है यहाँ एक समाधान है कि किसी भी दोहराया कॉलम दूर करने के लिए काम करेंगे है (सहित उदाहरण के लिए, दोहराया चरित्र, आंकिक, या कारक कॉलम के जोड़े)। इस तरह मैंने ओपी के सवाल को पढ़ा, और यहां तक ​​कि अगर यह गलत तरीके से पढ़ रहा है, तो यह एक दिलचस्प सवाल भी लगता है।

df <- read.table(text=" 
1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K") 

# Need to run duplicated() in 'both directions', since it considers 
# the first example to be **not** a duplicate. 
repdCols <- as.logical(duplicated(as.list(df), fromLast=FALSE) + 
         duplicated(as.list(df), fromLast=TRUE)) 
# [1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE 

df[!repdCols] 
# V1 V2 V3 V5 
# 1 1 1 1 1 
# 2 2 1 2 1 
# 3 3 8 3 1 
# 4 4 8 2 1 
# 5 1 1 1 1 
# 6 2 1 2 1 
2

ऑनलाइनर समाधान।

df2 <- df[sapply(df, function(x) !is.factor(x) | length(unique(x))>1)] 
संबंधित मुद्दे