【问题标题】:How to move data up and get rid of NA?如何向上移动数据并摆脱 NA?
【发布时间】:2021-09-19 21:39:29
【问题描述】:

photo of current data

数据显示某些点的 NA,但信息就在它的正下方。它是相同的 UPC、商店和周。如何对数据进行分组以避免冗余和 NA 数据?

这是我目前的代码:

`library(tidyverse)
RD <- read.csv("Raw Soft Drinks Sales Data.csv")
U  <- read.csv("UPC Soft Drinks.csv") %>%
  mutate(UPC   = as.factor(UPC),
         BRAND = as.factor(BRAND),
         CLASS = as.factor(CLASS))
RDX <- RD %>%
  filter(UPC != "Total") %>%
  select (-c(Total.Q1,Total.Q2,Total.Q3,Total.Q4))


RDXL <- RDX %>%
  pivot_longer(
    cols = starts_with("Week"),
#    cols = X1:X52,
#    cols = !c("STORE","UPC"),
    names_to = "WEEK", 
    names_prefix = "Week",
    values_to = "UNITS",
    values_drop_na = TRUE)

RDW <- pivot_wider(RDXL, names_from = "ITEM", values_from = "UNITS")%>%
  select(-TOTAL)

`

这是原始数据集的样子: original data

我需要将 Store、UPC、Dollars、Units、Feat、Deal 和 Week 作为它们自己的列。

【问题讨论】:

  • 请提供reproducible minimal example。特别是,以清晰且易于使用的格式提供一些样本和目标数据,例如使用dput() 并使用reprex-package。
  • 看起来像一个相当简单的合并/加入过程:merge(df[1:2] , df[c(1,3)]) 作为开始。 merge 是基础 R。在 tidyverse 中查找各种 *_join 函数的帮助页面和示例。
  • 请注意r标签页顶部的说明,尤其是不要使用图像的说明,因为没有人可以在不重新输入的情况下轻松使用它们。
  • 除了 G. Grothendieck 的评论,原因如下:meta.stackoverflow.com/a/285557/11374827

标签: r tidyverse data-wrangling tidy


【解决方案1】:

我认为您可能希望以宽格式获取所有数据。 如果您当前的数据对于每周的每个数据列 (DOLLARS:DEAL) 都有一个值,并且所有其他数据列都是 NA,您可能希望像这样合并数据:

最小示例数据

tibble(store=c(1,1,1), UPC=rep(1200000044, 3), week=c(1, 1, 1), DOLLARS=c(10.1, NA, NA), UNITS=c(NA, 30, NA), FEAT=c(NA, NA, 'unknown'))

# A tibble: 3 x 6
  store        UPC  week DOLLARS UNITS FEAT   
  <dbl>      <dbl> <dbl>   <dbl> <dbl> <chr>  
1     1 1200000044     1    10.1    NA NA     
2     1 1200000044     1    NA      30 NA     
3     1 1200000044     1    NA      NA unknown

解决方案

您可以按 ID 列(UPC、周)分组,然后将 sort 与 na.last=TRUE 分组:

library(dplyr)

 df %>% group_by(UPC, week) %>%
         mutate(across(DOLLARS:FEAT, sort, na.last = TRUE)) %>%
         filter(!if_all(DOLLARS:FEAT, is.na))

# A tibble: 1 x 6
# Groups:   UPC, week [1]
  store        UPC  week DOLLARS UNITS FEAT   
  <dbl>      <dbl> <dbl>   <dbl> <dbl> <chr>  
1     1 1200000044     1    10.1    30 unknown

原始数据的最小表示

df2<-tibble(store=c(1, 1), UPC=rep(1200000044, 2), ITEM=c('DOLLARS', 'UNITS'), Week.1=c(58.4, 29), Week.2=c(118.8, 55))

df2

# A tibble: 2 x 5
  store        UPC ITEM    Week.1 Week.2
  <dbl>      <dbl> <chr>    <dbl>  <dbl>
1     1 1200000044 DOLLARS   58.4   119.
2     1 1200000044 UNITS     29      55 

原始数据解决方案

从原始数据开始,可以依次pivot_longer %>% pivot_wider

df2 %>% pivot_longer(cols = starts_with('Week'), names_to = 'week', values_to = 'value')%>%
        pivot_wider(names_from = ITEM)

# A tibble: 2 x 5
  store        UPC week   DOLLARS UNITS
  <dbl>      <dbl> <chr>    <dbl> <dbl>
1     1 1200000044 Week.1    58.4    29
2     1 1200000044 Week.2   119.     55

【讨论】:

    【解决方案2】:

    我们也可以

    library(dplyr)
    df %>%
        group_by(UPC, week) %>%
        mutate(across(DOLLARS:FEAT, ~ .[order(is.na(.))])) %>%
        filter(if_all(DOLLARS:FEAT, Negate(is.na)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多