Изменение столбцов для получения уникальных значений, транспонирование другого столбца и добавление процента этих уникальных значений.

У меня есть подмножество данных, которое выглядит следующим образом:

Item Code Percentage
10000 123 0.2
10001 134 0.98
10001 152 0.02
10002 123 0.68
10003 123 1
10002 178 0.32
10004 189 1

Я хочу найти способ транспонирования таким образом, чтобы я сохранял только уникальные значения из столбца A, столбец B рассредоточен по разным столбцам в соответствии с уникальными значениями, а процентное соотношение заполняется этими значениями. См. Пример данных, которые я хочу дополнить:

Item 123 134 152 178 189
10000 0.2 0 0 0 0
10001 0 0.98 0.02 0 0
10002 0.68 0 0 0.3 0
10003 1 0 0 0 0
10004 0 0 0 0 1

В настоящее время я использую следующий формат:

       df <-df %>%
       group_by(Item) %>%
       mutate(n = row_number()) %>%
       spread(Code, Percentage)

Следуя этой структуре, я все еще получаю повторяющиеся (не уникальные) значения в столбце A. Я загрузил библиотеку (plyr), библиотеку (dplyr), библиотеку (tidyr) именно в таком порядке. Причина, по которой я упомянул, заключается в том, что я где-то читал, если вы измените порядок работы, но в итоге испортили результаты.

Если вам нужна дополнительная информация, дайте мне знать. Спасибо!

plyr находится на пенсии уже несколько лет назад. Вы можете сделать это с помощью tidyr, синтаксис которого также обновлен с spread до pivot_wider. Есть много ТАКИХ вопросов по этой же задаче; Я выкопаю несколько, чтобы отметить   —  person guirgo__    schedule 25.02.2021

Отвечает ли это на ваш вопрос? Почему pivot_wider считывает отдельные значения как дубликаты или создает длинный и широкий тиббл (без объединения строк)?   —  person guirgo__    schedule 25.02.2021

См. Также stackoverflow.com/q/64169332/5325862   —  person guirgo__    schedule 25.02.2021

Всем привет! Спасибо большое за вашу помощь! Оба варианта у меня сработали легко! Действительно ценю это! :)   —  person guirgo__    schedule 25.02.2021

См. также:  Как проверить числовые даты на неправильные значения?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. guirgo__

    с помощью tidyverse

    library(tidyverse)
    
    df <- read.table(text = "Item   Code    Percentage
    10000   123 0.2
    10001   134 0.98
    10001   152 0.02
    10002   123 0.68
    10003   123 1
    10002   178 0.32
    10004   189 1", header = T)
    
    pivot_wider(
      data = df, 
      id_cols = Item, 
      names_from = Code, 
      values_from = Percentage, 
      values_fill = 0
    )
    #> # A tibble: 5 x 6
    #>    Item `123` `134` `152` `178` `189`
    #>   <int> <dbl> <dbl> <dbl> <dbl> <dbl>
    #> 1 10000  0.2   0     0     0        0
    #> 2 10001  0     0.98  0.02  0        0
    #> 3 10002  0.68  0     0     0.32     0
    #> 4 10003  1     0     0     0        0
    #> 5 10004  0     0     0     0        1
    

    Создано 25 февраля 2021 года пакетом REPEX (v1.0.0)

    используя data.table

    library(data.table)
    setDT(df)
    dcast(data = df, formula = Item ~ Code, value.var = "Percentage", fill = 0)
    #>     Item  123  134  152  178 189
    #> 1: 10000 0.20 0.00 0.00 0.00   0
    #> 2: 10001 0.00 0.98 0.02 0.00   0
    #> 3: 10002 0.68 0.00 0.00 0.32   0
    #> 4: 10003 1.00 0.00 0.00 0.00   0
    #> 5: 10004 0.00 0.00 0.00 0.00   1
    

    Создано 25 февраля 2021 года пакетом REPEX (v1.0.0)

  2. guirgo__

    Проблема в том, что ему нужно выполнять группировку как по «Коду», так и по «Элементу».

    library(dplyr)
    library(tidyr)
    df %>%
       group_by(Code, Item) %>%
       mutate(n = row_number()) %>%
       ungroup %>%
       spread(Code, Percentage, fill = 0) %>%
       select(-n)
    

    -выход

    # A tibble: 5 x 6
    #   Item `123` `134` `152` `178` `189`
    #  <int> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1 10000  0.2   0     0     0        0
    #2 10001  0     0.98  0.02  0        0
    #3 10002  0.68  0     0     0.32     0
    #4 10003  1     0     0     0        0
    #5 10004  0     0     0     0        1
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: