मुझे फाइलों से भरी एक निर्देशिका लेने की जरूरत है, उन्हें पढ़ें, एनए मानों को हटा दें, और फिर केवल एक निश्चित संख्या में पंक्तियों वाली फाइलों को रखें, जिनमें उन पर सहसंबंध चलेंगे। मेरे पास पंक्तियों की सबसेटिंग तक सब कुछ है, जिसे मैं प्रबंधित नहीं कर सकता।

corr <- function(directory, threshold = 0){

 #reads directory of files

    file_list <- list.files(path = getwd()



 # takes file_list and makes each file into dataframe

    dflist <- lapply(file_list, read.csv)



 # returns list of files, na rows stripped

    nolist <- lapply(dflist, na.omit)

 # removes all with nrows < threshold

    abovelist <- c()
    
    for(file in nolist){
    if (nrow(file) > threshold)
          {append(abovelist, file)}
          }
          
 # 
 }

जैसा कि आप देख सकते हैं, मैंने लूप के लिए उपयोग करने की कोशिश की है, उन्हें nrow> थ्रेशोल्ड के साथ जोड़कर। लेकिन जब भी मैं इस चरण को चलाने का प्रयास करता हूं, तो जो कुछ भी लौटाता है वह उपरोक्त सूची में एक पूर्ण मूल्य है। मैंने वर्गाकार कोष्ठकों के साथ निम्नलिखित अंतःक्रिया पर ध्यान दिया है:

 > nrow(nolist[1])
 NULL

 > nrow(nolist[[1]])
 117

ऐसा लगता है कि कुछ फ़ंक्शन नोलिस्ट में डेटाफ्रेम को एक-इकाई सूचियों के रूप में एक्सेस करते हैं, और अन्य वास्तव में डेटाफ्रेम पर स्वयं प्राप्त करते हैं (जो मैं यहां चाहता हूं)। मैं यह कैसे सुनिश्चित करूँ, यहाँ और सामान्य रूप से?

r
0
Demosthenes 14 सितंबर 2020, 01:11

2 जवाब

सबसे बढ़िया उत्तर

इसे करने का एक आसान तरीका यहां दिया गया है:

abovelist <- nolist[sapply(nolist, function(x) nrow(x) > threshold)]
0
Ben Norris 14 सितंबर 2020, 13:30

सबसे पहले, आप कहीं भी संलग्न सूची को असाइनिंग नहीं कर रहे हैं, यही वजह है कि यह बस "गायब" हो जाती है। इसके अलावा, मुझे लगता है कि आप एक सूची आइटम के रूप में पूर्ण file डेटाफ्रेम जोड़ना चाहते हैं, इसलिए आपको इसे list() में लपेटना होगा। यदि आप ऐसा नहीं करते हैं, तो आप अपने abovelist में सभी स्तंभों को आइटम के रूप में जोड़ देंगे, जो मुझे लगता है कि अवांछित व्यवहार है।
इसलिए, अपना कोड ठीक करने के लिए, आप यही करना चाहेंगे:
if (nrow(file) >= threshold) {abovelist <- append(abovelist, list(file))}

दूसरे, R में सिंगल और डबल [ ब्रैकेट के अंतर पर आपके प्रश्न के लिए, इस स्पष्टीकरण.

अंत में, यहां एक बहुत ही सरल tidyverse-आपकी फाइलों के माध्यम से काम करने का तरीका है (बिना लूप, इंटरमीडिएट सूचियों और चरणबद्ध परिणामों को जोड़ने के लिए)।

library(dplyr)
library(purrr)
library(readr)

file_list <- list.files(path = getwd(), pattern = '\\.csv$')
threshold <- 2

filtered_file_list <- file_list %>%
  map(read_csv) %>%
  map(na.omit) %>%
  keep(~ nrow(.x) > threshold)
0
alex_jwb90 14 सितंबर 2020, 02:52