Разделить столбец на интервалы в зависимости от содержимого строки - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь преобразовать фрейм данных из одного столбца в отдельные столбцы - основным дескриптором в данных является «номер элемента», а затем включается информация о цене, дате, цвете и т. Д. Я бы просто разделил столбец в зависимости от номера строки, но так как каждый элемент имеет разное количество информации, это на самом деле не работает.

Я немного поигрался с этим, но не нашел ничего подходящего, поскольку я не могу использовать регулярные выражения для создания отдельного столбца (например, с использованием str_which), так как информация сильно отличается предмет к предмету. Как я могу использовать регулярные выражения для создания интервалов, на которые я затем могу разбить столбец (поэтому мне нужна информация между каждой строкой, содержащей «элемент» в отдельном столбце). Пример данных приведен ниже.

data

item 1
$600
red
item 2
$70
item 3
$430
orange
10/11/2017

Спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Вот функция для переформатирования ваших данных в зависимости от того, как вы хотите, чтобы конечный набор данных выглядел. Для функции вы предоставляете фрейм данных DF, переменную var и вектор имен столбцов в правильном порядке colnames и byitem для выбора выходного формата (по умолчанию TRUE, который выводит кадр данных с одной строкой на item):

library(tidyverse)

df_transform = function(DF, var, colnames, byitem = TRUE){
  if(byitem){
    ID = sym("rowid")
  }else{
    ID = sym("id")
  }
  DF %>%
    group_by(id = paste0("item", cumsum(grepl("item", var)))) %>%
    mutate(rowid = replace(2:n(), 2:n(), setNames(colnames[1:(n()-1)], 2:n()))) %>%
    filter(!grepl("item", var)) %>%
    spread(!!ID, var)
}

Выход:

> df_transform(df, var, c("price", "color", "date"))

# A tibble: 3 x 4
# Groups:   id [3]
  id    color  date       price
  <chr> <fct>  <fct>      <fct>
1 item1 red    <NA>       $600 
2 item2 <NA>   <NA>       $70  
3 item3 orange 10/11/2017 $430 


> df_transform(df, var, c("price", "color", "date"), byitem = FALSE)

# A tibble: 3 x 4
  rowid item1 item2 item3     
  <chr> <fct> <fct> <fct>     
1 color red   <NA>  orange    
2 date  <NA>  <NA>  10/11/2017
3 price $600  $70   $430  

Обратите внимание, что это не будет работать, если у вас пропущены значения в середине, поскольку имена столбцов назначаются по позиции.

Данные:

df <- structure(list(var = structure(c(5L, 2L, 9L, 6L, 3L, 7L, 1L, 
8L, 4L), .Label = c("$430", "$600", "$70", "10/11/2017", "item_1", 
"item_2", "item_3", "orange", "red"), class = "factor")), .Names = "var", class = "data.frame", row.names = c(NA, 
-9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...