अगर मेरे पास इस तरह का डेटा.फ्रेम है, लेकिन बहुत बड़ा है

> df
#     df 
#  1  G0100
#  2  G0546
#  3  G1573
#  4  G1748
#  5  G2214
#  6  G2473
#  7  G2764
#  8  G3421
#  9  G5748
#  10 G8943

क्या बहुत बड़े डेटा सेट में G1500 और G2500 के बीच एक श्रेणी का चयन करने का एक सुंदर तरीका है?

1
RCP9 23 जिंदा 2021, 00:17

3 जवाब

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

हम parse_number का उपयोग between के साथ कर सकते हैं

library(dplyr)
library(readr)
df %>%
  filter(between(parse_number(df), 1500, 2500))
4
akrun 23 जिंदा 2021, 00:21

प्रश्न से यह वास्तव में स्पष्ट नहीं है कि सामान्य मामला क्या है लेकिन हम विभिन्न मान्यताओं के आधार पर विभिन्न प्रकार के समाधान प्रदान करते हैं।

1) मान लीजिए

  • अंत में नोट में पुनरुत्पादित रूप से दिखाया गया इनपुट
  • निचली और ऊपरी सीमा दोनों 5 वर्ण हैं, जैसा कि प्रश्न में है

फिर दिखाए गए अनुसार subset का प्रयोग करें। यदि डेटा फ़्रेम में सभी मान 5 वर्ण हैं, तो पहली शर्त को छोड़ा जा सकता है।

subset(df, nchar(df) == 5 & df >= "G1500" & df <= "G2500")

देना:

     df
3 G1573
4 G1748
5 G2214
6 G2473

2) एक और संभावना जो ऊपर की दूसरी धारणा को शिथिल करती है, वह निम्नलिखित है जो ऊपर के समान आउटपुट देती है। strapply का दूसरा तर्क सूत्र संकेतन में दिया गया एक फ़ंक्शन है। x पहले कैप्चर समूह से संबंधित पहला तर्क है और y दूसरे कैप्चर समूह के अनुरूप दूसरा तर्क है।

library(gsubfn)
subset(df, strapply(df, "(.)(.*)", 
   ~ x=='G' & as.numeric(y) >= 1500 & as.numeric(y) <= 2500, 
   simplify = TRUE))

3) यदि डेटा फ्रेम में प्रत्येक प्रविष्टि G से शुरू होती है या यदि हम अक्षर को अनदेखा कर सकते हैं तो हम इसे छोड़ सकते हैं।

num <- as.numeric(sub("G", "", df$df))
subset(df, num >= 1500 & num <= 2500)

4) पहले वर्ण और शेष को एक नए डेटा फ़्रेम DF के अलग-अलग कॉलम में पढ़ने और फिर सबसेट का उपयोग करने के लिए एक और बदलाव:

DF <- read.table(text = sub("(.)", "\\1 ", df$df))
subset(df, DF$V1 == "G" & DF$V2 >= 1500 & DF$V2 <= 2500)

ध्यान दें

Lines <- "
        df 
  1  G0100
  2  G0546
  3  G1573
  4  G1748
  5  G2214
  6  G2473
  7  G2764
  8  G3421
  9  G5748
  10 G8943"
df <- read.table(text = Lines)
2
G. Grothendieck 23 जिंदा 2021, 01:50

एक data.table विकल्प

> setDT(df)[, .SD[between(as.numeric(gsub("\\D", "", df)), 1500, 2500)]]
      df
1: G1573
2: G1748
3: G2214
4: G2473
2
ThomasIsCoding 23 जिंदा 2021, 01:32