मैं एक वेबसाइट से कुछ मुद्रा व्यापार डेटा का विश्लेषण करना चाहता हूं, लेकिन डेटा केवल कॉपी-एंड-पेस्ट के माध्यम से ही पहुंच योग्य है। मैं इसे अपने कंप्यूटर के क्लिपबोर्ड पर कॉपी करता हूं और इसे आर में आयात करता हूं:

#df <- read.table("clipboard", header = FALSE, sep = "\t", stringsAsFactors = FALSE, na.strings = "", fill = TRUE)

लेकिन डेटा फ्रेम एक अवलोकन को चार पंक्तियों में छोड़ देता है जब इसे आर में पढ़ा जाता है:

df <- structure(list(V1 = c("Buy", "Completed", "Fee1.00 USD", "Total199.00 USD", "Buy", "Completed", "Fee0.50 USD", "Total100.00 USD", "Buy", "Completed", "Fee0.64 USD", "Total127.00 USD"), V2 = c(NA, "2021-02-11 20:49:19", NA, NA, NA, "2021-02-11 20:48:03", NA, NA, NA, "2021-02-11 20:47:22", NA, NA), V3 = c(NA, "0.11057", NA, NA, NA, "82.146", NA, NA, NA, "30.15", NA, NA)), row.names = c(NA, 12L), class = "data.frame")
df

#               V1                  V2      V3
#1              Buy                <NA>    <NA>
#2        Completed 2021-02-11 20:49:19 0.11057
#3      Fee1.00 USD                <NA>    <NA>
#4  Total199.00 USD                <NA>    <NA>
#5              Buy                <NA>    <NA>
#6        Completed 2021-02-11 20:48:03  82.146
#7      Fee0.50 USD                <NA>    <NA>
#8  Total100.00 USD                <NA>    <NA>
#9              Buy                <NA>    <NA>
#10       Completed 2021-02-11 20:47:22   30.15
#11     Fee0.64 USD                <NA>    <NA>
#12 Total127.00 USD                <NA>    <NA>

इसलिए मैं चार पंक्तियों की प्रत्येक श्रृंखला को एक में संक्षिप्त करना चाहता हूं, इस तरह, जो डेटा आयात प्रक्रिया की एक विचित्रता के रूप में उत्पन्न लापता मूल्यों को अधिलेखित कर देता है:

want <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "Buy", class = "factor"), V2 = structure(c(1L, 1L, 1L), .Label = "Completed", class = "factor"), V3 = structure(3:1, .Label = c("2/11/2021 20:47", "2/11/2021 20:48", "2/11/2021 20:49"), class = "factor"), V4 = c(0.11057, 82.146,     30.15), V5 = structure(c(3L, 1L, 2L), .Label = c("Fee0.50 USD", "Fee0.64 USD", "Fee1.00 USD"), class = "factor"), V6 = structure(c(3L, 1L, 2L), .Label = c("Total100.00 USD", "Total127.00 USD", "Total199.00 USD"), class = "factor")), class = "data.frame", row.names = c(NA, -3L))
want

#   V1        V2        V3            V4      V5              V6
#1 Buy Completed 2/11/2021 20:49  0.11057 Fee1.00 USD Total199.00 USD
#2 Buy Completed 2/11/2021 20:48 82.14600 Fee0.50 USD Total100.00 USD
#3 Buy Completed 2/11/2021 20:47 30.15000 Fee0.64 USD Total127.00 USD

जाहिर है, चीजें अभी भी थोड़ी गड़बड़ होंगी क्योंकि मुझे कुछ स्ट्रिंग्स को अलग-अलग कॉलम में विभाजित करने की आवश्यकता होगी (उदाहरण के लिए df$V5 = "Fee1.00 USD" df$Fee = 1.00 बन जाएगा), लेकिन यह एक अलग मुद्दा है।

मैंने एक आईडी वेरिएबल जोड़ने और फिर लंबे से चौड़े, को जोड़ने का प्रयास किया है। जैसा कि यहां चर्चा की गई है, लेकिन यह मेरे लिए आवश्यक मान लेने से और भी गड़बड़ हो जाता है (उदाहरण के लिए "शुल्क 1.00 USD" में 1.00) और उन्हें नए कॉलम नामों के रूप में रखना:

df$id <- gl((nrow(df)/4), 4)
reshape(df, timevar = "V1", idvar = "id", direction = "wide")

और मैंने डेटा फ़्रेम को डेटा फ़्रेम की सूची में विभाजित करने का प्रयास किया है, जैसा कि यहां चर्चा की गई है, लेकिन मुझे अभी भी यकीन नहीं है कि प्रत्येक को कैसे संक्षिप्त करें और इसे एक साथ वापस कैसे सिलाई करें:

split(df, f = df$id)

डेटा को उचित प्रारूप में लाने का सबसे अच्छा तरीका क्या है?

0
coip 12 फरवरी 2021, 23:03

2 जवाब

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

इस बारे में कैसा है:

library(dplyr)
library(tidyr)
df <- df %>% mutate(obs = rep(1:(nrow(.)/4), each=4))
df <- df %>% 
  pivot_longer(-obs, names_to="var", values_to="vals") %>% 
  na.omit() %>% 
  group_by(obs) %>% 
  mutate(col = seq_along(obs)) %>% 
  select(obs, col, vals) %>% 
  pivot_wider(names_from="col", names_prefix="V", values_from="vals")
df
# # A tibble: 3 x 7
# # Groups:   obs [3]
#     obs V1    V2        V3                  V4      V5          V6             
#   <int> <chr> <chr>     <chr>               <chr>   <chr>       <chr>          
# 1     1 Buy   Completed 2021-02-11 20:49:19 0.11057 Fee1.00 USD Total199.00 USD
# 2     2 Buy   Completed 2021-02-11 20:48:03 82.146  Fee0.50 USD Total100.00 USD
# 3     3 Buy   Completed 2021-02-11 20:47:22 30.15   Fee0.64 USD Total127.00 USD 
3
DaveArmstrong 12 फरवरी 2021, 23:28

डेव का जवाब पूरी तरह से काम करता है और अच्छी तरह से संक्षिप्त है। अगर किसी कारण से कोई बाहरी पैकेज का उपयोग नहीं कर सकता है, तो मैंने उसकी स्क्रिप्ट को एक गाइड के रूप में इस्तेमाल किया और बेस आर का उपयोग करके इसे दोहराने की कोशिश की:

df$id <- gl((nrow(df) / 4), 4)
df <- reshape(df, idvar = "id",
              v.names = "val",
              timevar = "var",
              times = names(df[1:3]),
              varying = names(df[1:3]),
              new.row.names = 1:1000,
              direction = "long")
df <- na.omit(df)
df <- df[order(df$id),]
df$col <- ave(seq_len(nrow(df)), df$id, FUN = seq_along)
df <- subset(df, select = c("id", "col", "val"))
df <- reshape(df, timevar = "col",
              idvar = "id",
              direction = "wide")
colnames(df) <- c("id", "V1", "V2", "V5", "V6", "V3", "V4")
varnames <- c("id", "V1", "V2", "V3", "V4", "V5", "V6")
df <- df[, varnames]
df
0
coip 13 फरवरी 2021, 03:34