R में डेटा फ़ाइल की खाली पंक्तियों को हटाना


82

मेरे पास खाली पंक्तियों वाला एक डेटासेट है। मैं उन्हें निकालना चाहूंगा:

myData<-myData[-which(apply(myData,1,function(x)all(is.na(x)))),]

यह ठीक काम करता है। लेकिन अब मैं अपने डेटा में एक कॉलम जोड़ना और पहले मूल्य को इनिशियलाइज़ करना चाहूँगा:

myData$newCol[1] <- -999

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = -999) : 
  replacement has 1 rows, data has 0

दुर्भाग्य से यह काम नहीं करता है और मुझे वास्तव में समझ में नहीं आता है कि मैं इसे क्यों हल नहीं कर सकता हूं। जब मैंने एक समय में एक लाइन को हटा दिया तो यह काम कर गया:

TgData = TgData[2:nrow(TgData),]

या ऐसा ही कुछ।

यह भी काम करता है जब मैंने केवल पहली 13.000 पंक्तियों का उपयोग किया था।

लेकिन यह 32.000 पंक्तियों के साथ मेरे वास्तविक डेटा के साथ काम नहीं करता है।

मैंने गलत क्या किया? यह मेरे लिए कोई मतलब नहीं है।


जवाबों:


106

मुझे लगता है कि आप उन पंक्तियों को हटाना चाहते हैं जो सभी NA हैं। फिर, आप निम्न कार्य कर सकते हैं:

data <- rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(NA, NA, NA), c(4, 8, NA)) # sample data
data
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]   NA   NA   NA
[5,]    4    8   NA

data[rowSums(is.na(data)) != ncol(data),]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1   NA    4
[3,]    4    6    7
[4,]    4    8   NA

यदि आप उन पंक्तियों को हटाना चाहते हैं जिनमें कम से कम एक NA है, तो बस स्थिति बदलें:

data[rowSums(is.na(data)) == 0,]
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    6    7

34
दूसरे मामले को भी इसके जरिए संभाला जा सकता है data[complete.cases(data),]
जोशुआ उलरिच

@JoshuaUlrich आपकी मदद के जवाब के लिए Thx! सिर्फ समझ के लिए? आप अपने कोड ,के अंत में एक क्यों करते हैं data[complete.cases(data),]?
अन्ना.किले

1
@mrquad, इसका मतलब है कि आप पंक्तियों द्वारा कम कर रहे हैं; देख stackoverflow.com/a/17052459/2152245
मैट

56

यदि आपके पास खाली पंक्तियाँ हैं, तो NA नहीं, आप कर सकते हैं:

data[!apply(data == "", 1, all),]

दोनों को हटाने के लिए (NA और खाली):

data <- data[!apply(is.na(data) | data == "", 1, all),]

13

यहाँ कुछ dplyrविकल्प दिए गए हैं :

# sample data
df <- data.frame(a = c('1', NA, '3', NA), b = c('a', 'b', 'c', NA), c = c('e', 'f', 'g', NA))

library(dplyr)

# remove rows where all values are NA:
df %>% filter_all(any_vars(!is.na(.)))
df %>% filter_all(any_vars(complete.cases(.)))  


# remove rows where only some values are NA:
df %>% filter_all(all_vars(!is.na(.)))
df %>% filter_all(all_vars(complete.cases(.)))  

# or more succinctly:
df %>% filter(complete.cases(.))  
df %>% na.omit

# dplyr and tidyr:
library(tidyr)
df %>% drop_na

1
न तो na.omit () और न ही drop_na () नॉन-एनए पंक्तियाँ लौटाएँ।

8

पैकेज NAका उपयोग करते हुए पंक्तियों के लिए वैकल्पिक समाधानjanitor

myData %>% remove_empty("rows")

1
यह सबसे सरल समाधान था और इसने मेरे लिए काम किया - धन्यवाद!

2

यह ऊपर दिए गए कुछ उत्तरों के समान है, लेकिन इसके साथ ही आप यह निर्दिष्ट कर सकते हैं कि क्या आप दिए गए मानों के प्रतिशत के साथ पंक्तियों को हटाना चाहते हैं-किसी दिए गए प्रतिशत से अधिक-से-बराबर या तर्क के साथ (तर्क के साथ pct)

drop_rows_all_na <- function(x, pct=1) x[!rowSums(is.na(x)) >= ncol(x)*pct,]

जहां xएक डेटाफ्रेम है और pctइसकी दहलीज हैNA डेटाफ्रेम आप जिस डेटा से छुटकारा चाहते हैं उसकी है।

pct = 1इसका मतलब है कि उन पंक्तियों को हटा दें जिनके 100% मान हैं NApct = .5रिमोम पंक्तियों का मतलब है कि इसके आधे मान कम से कम हैंNA


Df पर इस FUN का उपयोग कैसे करें?
क्षितिज मनवेलिकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.