r एक गंदे डेटा प्रारूप के बारे में आर क्या कर सकता है?




dataframe (5)

जैसा कि यह सुझाव दिया गया था, आप डेटाफ़्रेम की सामग्री को फ़ाइल में सहेजने के लिए, पाठ संपादक में फ़ाइल को खोलने और उसकी सामग्री को पेस्ट करने के लिए dput का उपयोग कर सकते हैं। Mtcar के डेटासेट का उदाहरण पहले 10 पंक्तियों तक सीमित है:

dput(mtcars  %>% head(10), file = 'reproducible.txt')

Reproducible.txt की सामग्री का उपयोग tibble / tibble बनाने के लिए किया जा सकता है जैसा कि नीचे दिखाया गया है। ऐसे मामले में डेटा प्रारूप पठनीय है, लेकिन पहली नज़र में (आर पर चिपकाए बिना) मानव द्वारा इसे समझना मुश्किल है।

df <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3,
24.4, 22.8, 19.2), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6), disp = c(160,
160, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6), hp = c(110,
110, 93, 110, 175, 105, 245, 62, 95, 123), drat = c(3.9, 3.9,
3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92), wt = c(2.62,
2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44), qsec = c(16.46,
17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3), vs = c(0,
0, 1, 1, 0, 1, 0, 1, 1, 1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0,
0), gear = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4), carb = c(4, 4, 1,
1, 2, 1, 4, 2, 2, 4)), .Names = c("mpg", "cyl", "disp", "hp",
"drat", "wt", "qsec", "vs", "am", "gear", "carb"), row.names = c("Mazda RX4",
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout",
"Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280"), class = "data.frame")

कभी-कभी मैं एक स्टैक ओवरफ्लो प्रश्न में पोस्ट किए गए डेटा को इस प्रश्न की तरह स्वरूपित देखता हूं। यह पहली बार नहीं है, इसलिए मैंने इसके बारे में एक सवाल पूछने का फैसला किया है, और पोस्ट किए गए डेटा को पैलेट करने के तरीके के साथ सवाल का जवाब देना है।

प्रश्न डिलीट होने की स्थिति में मैं यहां डेटासेट उदाहरण पोस्ट करूंगा।

+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+

जैसा कि आप देख सकते हैं कि यह डेटा पोस्ट करने का सही तरीका नहीं है। जैसा कि एक उपयोगकर्ता ने एक टिप्पणी में लिखा है,

यह जिस तरह से आप इसे यहाँ दिखा रहे हैं, डेटा को प्रारूपित करने में थोड़ा समय लगा होगा। दुर्भाग्य से यह हमारे लिए कॉपी और पेस्ट करने का एक अच्छा प्रारूप नहीं है।

मेरा मानना ​​है कि यह सब कहता है। पूछने वाला अच्छी तरह से इरादा रखता है और अच्छा बनने की कोशिश में कुछ काम और समय लगता है, लेकिन परिणाम अच्छा नहीं होता है।

उस तालिका को उपयोग योग्य बनाने के लिए आर कोड क्या कर सकता है, अगर कुछ भी हो? क्या यह बहुत परेशानी का सबब बनेगा?


प्रश्न का संक्षिप्त उत्तर हां है, आर कोड उस गड़बड़ को हल कर सकता है और नहीं, यह बहुत परेशानी नहीं उठाता है।

तालिका को R सेशन में कॉपी और पेस्ट करने के बाद पहला कदम है, इसे रीड करने में strip.whitestrip.white को header , sep , strip.white और strip.white तर्क के साथ सेट करना है।

मुझे strip.white की याद दिलाने का श्रेय comment.char strip.white और strip.white @nicola, और उसकी टिप्पणी पर जाएं।

dat <- read.table(text = "
+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+
", header = TRUE, sep = "|", comment.char = "+", strip.white = TRUE)

लेकिन जैसा कि आप देख सकते हैं कि परिणाम के साथ कुछ मुद्दे हैं।

dat
   X       Date Emp1 Case Priority PriorityCountinLast7days X.1
1 NA 2018-06-01    A   A1        0                        0  NA
2 NA 2018-06-03    A   A2        0                        1  NA
3 NA 2018-06-03    A   A3        0                        2  NA
4 NA 2018-06-03    A   A4        1                        1  NA
5 NA 2018-06-03    A   A5        2                        1  NA
6 NA 2018-06-04    A   A6        0                        3  NA
7 NA 2018-06-01    B   B1        0                        1  NA
8 NA 2018-06-02    B   B2        0                        2  NA
9 NA 2018-06-03    B   B3        0                        3  NA

विभाजकों को शुरू करने और समाप्त करने के लिए प्रत्येक डेटा पंक्ति आर का मानना ​​है कि उन विभाजक अतिरिक्त कॉलमों को चिह्नित करते हैं, जो कि मूल प्रश्न के ओपी का मतलब नहीं है।

इसलिए दूसरा कदम केवल असली कॉलम को रखना है। मैं यह कॉलम अपनी संख्याओं के आधार पर करूँगा, आसानी से किया जा सकता है, वे आम तौर पर पहले और अंतिम कॉलम होते हैं।

dat <- dat[-c(1, ncol(dat))]
dat
          Date   Emp1   Case Priority PriorityCountinLast7days
1  2018-06-01   A      A1           0                        0
2  2018-06-03   A      A2           0                        1
3  2018-06-03   A      A3           0                        2
4  2018-06-03   A      A4           1                        1
5  2018-06-03   A      A5           2                        1
6  2018-06-04   A      A6           0                        3
7  2018-06-01   B      B1           0                        1
8  2018-06-02   B      B2           0                        2
9  2018-06-03   B      B3           0                        3

यह बहुत कठिन नहीं था, बहुत बेहतर।
इस स्थिति में अभी भी एक समस्या है, Date को कक्षा Date लिए स्तंभित करने के लिए।

dat$Date <- as.Date(dat$Date)

और परिणाम संतोषजनक है।

str(dat)
'data.frame':   9 obs. of  5 variables:
 $ Date                    : Date, format: "2018-06-01" "2018-06-03" ...
 $ Emp1                    : Factor w/ 2 levels "A","B": 1 1 1 1 1 1 2 2 2
 $ Case                    : Factor w/ 9 levels "A1","A2","A3",..: 1 2 3 4 5 6 7 8 9
 $ Priority                : int  0 0 0 1 2 0 0 0 0
 $ PriorityCountinLast7days: int  0 1 2 1 1 3 1 2 3

ध्यान दें कि मैंने अधिक या कम मानक तर्क stringsAsFactors = FALSE निर्धारित नहीं किया है। जरूरत पड़ने पर, यह read.table रन करते समय किया जाना चाहिए।

पूरी प्रक्रिया में आधार आर कोड की केवल 3 लाइनें लगीं।

अंत में, dput प्रारूप में अंतिम परिणाम, जैसे यह पहले स्थान पर होना चाहिए।

dat <-
structure(list(Date = structure(c(17683, 17685, 17685, 17685, 
17685, 17686, 17683, 17684, 17685), class = "Date"), Emp1 = c("A", 
"A", "A", "A", "A", "A", "B", "B", "B"), Case = c("A1", "A2", 
"A3", "A4", "A5", "A6", "B1", "B2", "B3"), Priority = c(0, 0, 
0, 1, 2, 0, 0, 0, 0), PriorityCountinLast7days = c(0, 1, 2, 1, 
1, 3, 1, 2, 3)), row.names = c(NA, -9L), class = "data.frame")

मुद्दा यह नहीं है कि कोड की कितनी पंक्तियाँ हैं, दो या पाँच हैं, बहुत अंतर नहीं है। सवाल यह है कि क्या यह आपके द्वारा यहां पोस्ट किए गए उदाहरण से परे काम करेगा।

मैं इस तरह की चीज़ों को लेकर नहीं आया हूं, लेकिन मुझे एक और उदाहरण का निर्माण करना था, जिसके बारे में मुझे लगता था कि यह कल्पना की जा सकती है।

मैं तब से कुछ और मामलों में आया हूं और उन्हें टेस्ट सूट में जोड़ा है।

मैंने बॉक्स-ड्राइंग वर्णों का उपयोग करके एक तालिका भी तैयार की है। आप इन दिनों इस पर नहीं आते हैं, लेकिन पूर्णता के लिए यह यहाँ है।

x1 <- "
+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+
"

x2 <- "
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
    Date    | Emp1 | Case | Priority | PriorityCountinLast7days 
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
 2018-06-01 | A    | A|1  |        0 |                        0 
 2018-06-03 | A    | A|2  |        0 |                        1 
 2018-06-02 | B    | B|2  |        0 |                        2 
 2018-06-03 | B    | B|3  |        0 |                        3 
––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
"

x3 <- "
 Maths | English | Science | History | Class

  0.1  |  0.2    |  0.3    |  0.2    |  Y2

  0.9  |  0.5    |  0.7    |  0.4    |  Y1

  0.2  |  0.4    |  0.6    |  0.2    |  Y2

  0.9  |  0.5    |  0.2    |  0.7    |  Y1
"

x4 <- "
       Season   |   Team  | W | AHWO
-------------------------------------
1  |  2017/2018 |  TeamA  | 2 | 1.75
2  |  2017/2018 |  TeamB  | 1 | 1.85
3  |  2017/2018 |  TeamC  | 1 | 1.70
4  |  2016/2017 |  TeamA  | 1 | 1.49
5  |  2016/2017 |  TeamB  | 3 | 1.51
6  |  2016/2017 |  TeamC  | 2 | N/A
"

x5 <- "
    A   B   C
  ┌───┬───┬───┐
A │ 5 │ 1 │ 4 │
  ├───┼───┼───┤
B │ 2 │ 5 │ 3 │
  ├───┼───┼───┤
C │ 3 │ 4 │ 4 │
  └───┴───┴───┘
"

x6 <- "
------------------------------------------------------------
|date              |Material          |Description         |
|----------------------------------------------------------|
|10/04/2013        |WM.5597394        |PNEUMATIC           |
|11/07/2013        |GB.D040790        |RING                |
------------------------------------------------------------
------------------------------------------------------------
|date              |Material          |Description         |
|----------------------------------------------------------|
|08/06/2013        |WM.4M01004A05     |TOUCHEUR            |
|08/06/2013        |WM.4M010108-1     |LEVER               |
------------------------------------------------------------
"

एक समारोह में जाना

f <- function(x=x6, header=TRUE, rem.dup.header=header, 
  na.strings=c("NA", "N/A"), stringsAsFactors=FALSE, ...) {

    # read each row as a character string
    x <- scan(text=x, what="character", sep="\n", quiet=TRUE)

    # keep only lines containing alphanumerics
    x <- x[grep("[[:alnum:]]", x)]

    # remove vertical bars with trailing or leading space
    x <- gsub("\\|? | \\|?", " ", x)

    # remove vertical bars at beginning and end of string
    x <- gsub("\\|?$|^\\|?", "", x)

    # remove vertical box-drawing characters
    x <- gsub("\U2502|\U2503|\U2505|\U2507|\U250A|\U250B", " ", x)

    if (rem.dup.header) {
        dup.header <- x == x[1]
        dup.header[1] <- FALSE
        x <- x[!dup.header]
    }

    # read the result as a table
    read.table(text=paste(x, collapse="\n"), header=header, 
      na.strings=na.strings, stringsAsFactors=stringsAsFactors)    
}


lapply(c(x1, x2, x3, x4, x5, x6), f)

उत्पादन

[[1]]
        Date Emp1 Case Priority PriorityCountinLast7days
1 2018-06-01    A   A1        0                        0
2 2018-06-03    A   A2        0                        1
3 2018-06-02    B   B2        0                        2
4 2018-06-03    B   B3        0                        3

[[2]]
        Date Emp1 Case Priority PriorityCountinLast7days
1 2018-06-01    A  A|1        0                        0
2 2018-06-03    A  A|2        0                        1
3 2018-06-02    B  B|2        0                        2
4 2018-06-03    B  B|3        0                        3

[[3]]
  Maths English Science History Class
1   0.1     0.2     0.3     0.2    Y2
2   0.9     0.5     0.7     0.4    Y1
3   0.2     0.4     0.6     0.2    Y2
4   0.9     0.5     0.2     0.7    Y1

[[4]]
     Season  Team W AHWO
1 2017/2018 TeamA 2 1.75
2 2017/2018 TeamB 1 1.85
3 2017/2018 TeamC 1 1.70
4 2016/2017 TeamA 1 1.49
5 2016/2017 TeamB 3 1.51
6 2016/2017 TeamC 2   NA

[[5]]
  A B C
A 5 1 4
B 2 5 3
C 3 4 4

[[6]]
        date      Material Description
1 10/04/2013    WM.5597394   PNEUMATIC
2 11/07/2013    GB.D040790        RING
3 08/06/2013 WM.4M01004A05    TOUCHEUR
4 08/06/2013 WM.4M010108-1       LEVER

x3 here से here (संपादित इतिहास को देखना होगा)।
x4 here से here
x6 here से here


data.table::fread का उपयोग करना:

x = '
+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+
'

fread(gsub('\\+.+\\n' ,'', x, perl = T), drop=c(1,7))

#          Date Emp1 Case Priority PriorityCountinLast7days
# 1: 2018-06-01    A   A1        0                        0
# 2: 2018-06-03    A   A2        0                        1
# 3: 2018-06-03    A   A3        0                        2
# 4: 2018-06-03    A   A4        1                        1
# 5: 2018-06-03    A   A5        2                        1
# 6: 2018-06-04    A   A6        0                        3
# 7: 2018-06-01    B   B1        0                        1
# 8: 2018-06-02    B   B2        0                        2
# 9: 2018-06-03    B   B3        0                        3

gsub भाग क्षैतिज नियमों को हटा देता है। drop लाइन सिरों पर सीमांकक के कारण होने वाले अतिरिक्त स्तंभों को हटा देता है।


खैर, इस विशिष्ट डेटासेट के बारे में मैंने RStudio में आयात सुविधा का उपयोग किया, लेकिन मैंने पहले से एक अतिरिक्त कदम उठाया।

  1. डेटासेट को नोटपैड फ़ाइल में कॉपी करें।
  2. सभी बदलें | के साथ वर्ण ,
  3. इस कोड का उपयोग करके read.csv को read.csv का उपयोग करके नोटपैड फ़ाइल Import करें (द्वारा स्तंभों को अलग करें)।

लेकिन, अगर आपका मतलब है कि एक चरण में इसे पूरी तरह से समझने के लिए आर का उपयोग करें, तो मुझे कोई पता नहीं है।







dataframe