根据行内容将列分为间隔

时间:2018-11-08 19:15:37

标签: r

我正在尝试将单列数据帧转换为单独的列-数据中的主要描述符是“项目编号”,然后包含有关价格,日期,颜色等的信息。我将列拆分取决于行号,但是由于每一项都有不同的信息量,所以这实际上是行不通的。

我一直在处理这个问题,但是根本没有找到任何东西,因为我不能使用regex创建单独的列(例如,使用str_which),因为信息差异很大逐项。如何使用正则表达式创建间隔,然后将其拆分为该间隔(因此,我需要在单独的列中包含“项目”的每一行之间的信息)。示例数据如下。

data

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个根据您希望最终数据集的外观重新格式化数据的功能。对于该函数,您提供数据帧DF,变量var以及正确的列名向量colnamesbyitem以选择输出格式(默认是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))