r - 根据行内容将列拆分为间隔
问题描述
我正在尝试将单列数据框转换为单独的列——数据中的主要描述符是“项目编号”,然后包括价格、日期、颜色等信息。我只是根据行拆分列数字,但由于每个项目都有不同数量的信息,这实际上并不奏效。
我一直在玩这个,但没有发现任何可以接近的东西,因为我不能使用正则表达式来创建一个单独的列(例如,使用 str_which),因为信息差异很大。 . 如何使用正则表达式创建间隔,然后我可以将列拆分为(因此我需要在单独列中包含“项目”的每一行之间的信息)。示例数据如下。
data
item 1
$600
red
item 2
$70
item 3
$430
orange
10/11/2017
谢谢!
解决方案
这是一个根据您希望最终数据集的外观重新格式化数据的功能。对于函数,您以正确的顺序提供 dataframe DF
、 variablevar
和列名向量,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))
推荐阅读
- php - 如何在 PHP 中使用多个搜索条件查找相关库存?
- regex - 使用 BASH 和正则表达式按名称提取函数体
- python - 在 Windows 中将字符串传递给 pathlib.Path 时出现操作系统错误
- git - 如何在网络核心解决方案中设置常规提交?
- java - Log4j2 自定义过滤器 xml 到属性文件
- php - .htaccess 应该重定向到指定的站点,但会将其重定向到一些废话重复 wtf 页面。为什么?
- ios - iOS会自动清理缓存目录吗?
- angular - 无法使用 Observable、Firebase (Angular 6) 为 var 赋值
- laravel - 为什么我得到一个 404 到 laravel 5.7 公共子文件夹?
- python - 为什么 render_template 没有被表达?