JMP 拆分的 tidyr 或 dplyr 等价物 table
tidyr or dplyr equivalent of JMP split table
JMP 有一个 "split table" 平台:
http://www.jmp.com/support/help/Split_Columns.shtml
这是它的图片:
"split by" 成为列 headers 的一部分。
"split columns" 是展开的列。
"group" 是保留的列。
我已经看过一些 links/pages 并且似乎无法在 R 中得到正确的结果。现在我必须将它拼凑成 JMP 中的宏。
对我没有帮助的链接包括:
- Use dplyr's group_by to perform split-apply-combine
- https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
- Split a column of a data frame to multiple columns
我需要将 ~20k 行和~30 列的 table 沿着其中一列(0 到 13 之间的整数)拆分为 ~1400 行,其中 ~25 拆分为 350。
一个不优雅,但重复table,例子是分裂这个cars table
据此:
产生这个:
如何使用 tidyr 或 dplyr 等 R 库执行此操作并保留 ~5 non-split 列?
使用reshape,一次拆分一个列也不是太可怕。然后您可以将模型和 engine.disp 合并在一起。对于您的真实示例,您可以只更改聚合中的列表和转换中的公式。
x <- read.csv('http://web.pdx.edu/~gerbing/data/cars.csv',stringsAsFactors = F)
names(x) <- tolower(names(x))
agg <- aggregate(list(model = x$model),list(origin = x$origin,cylinders = x$cylinders,year = x$year),FUN = paste,collapse = ',')
require(reshape)
output <- cast(data = agg,formula = origin + cylinders ~ year,value = 'model')
编辑:
我没有检查所有可能的情况,但这个功能应该类似于拆分表,或者至少给你一个好的开始。
x <- read.csv('http://web.pdx.edu/~gerbing/data/cars.csv',stringsAsFactors = F)
names(x) <- tolower(names(x))
jmpsplitcol <- function(data,splitby,splitcols,group){
require(reshape)
require(tidyr)
aggsplitlist <- data[ ,names(data) %in% c(splitby,group)]
aggsplitlist <- lapply(aggsplitlist,`[`)
agg <- aggregate(list(data[ ,names(data) %in% splitcols]),aggsplitlist,FUN = paste,collapse = ',')
newgat <- gather_(data = agg,key = 'splitcolname','myval',splitcols)
castformula <- as.formula(paste(paste(group,collapse = ' + '),'~','splitcolname','+',splitby))
output <- cast(data = newgat,formula = castformula,value = 'myval')
output
}
res <- jmpsplitcol(x,c('year'),c('engine.disp','model'),c('origin','cylinders'))
head(res2)
JMP 有一个 "split table" 平台:
http://www.jmp.com/support/help/Split_Columns.shtml
这是它的图片:
"split by" 成为列 headers 的一部分。
"split columns" 是展开的列。
"group" 是保留的列。
我已经看过一些 links/pages 并且似乎无法在 R 中得到正确的结果。现在我必须将它拼凑成 JMP 中的宏。
对我没有帮助的链接包括:
- Use dplyr's group_by to perform split-apply-combine
- https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
- Split a column of a data frame to multiple columns
我需要将 ~20k 行和~30 列的 table 沿着其中一列(0 到 13 之间的整数)拆分为 ~1400 行,其中 ~25 拆分为 350。
一个不优雅,但重复table,例子是分裂这个cars table
据此:
产生这个:
如何使用 tidyr 或 dplyr 等 R 库执行此操作并保留 ~5 non-split 列?
使用reshape,一次拆分一个列也不是太可怕。然后您可以将模型和 engine.disp 合并在一起。对于您的真实示例,您可以只更改聚合中的列表和转换中的公式。
x <- read.csv('http://web.pdx.edu/~gerbing/data/cars.csv',stringsAsFactors = F)
names(x) <- tolower(names(x))
agg <- aggregate(list(model = x$model),list(origin = x$origin,cylinders = x$cylinders,year = x$year),FUN = paste,collapse = ',')
require(reshape)
output <- cast(data = agg,formula = origin + cylinders ~ year,value = 'model')
编辑: 我没有检查所有可能的情况,但这个功能应该类似于拆分表,或者至少给你一个好的开始。
x <- read.csv('http://web.pdx.edu/~gerbing/data/cars.csv',stringsAsFactors = F)
names(x) <- tolower(names(x))
jmpsplitcol <- function(data,splitby,splitcols,group){
require(reshape)
require(tidyr)
aggsplitlist <- data[ ,names(data) %in% c(splitby,group)]
aggsplitlist <- lapply(aggsplitlist,`[`)
agg <- aggregate(list(data[ ,names(data) %in% splitcols]),aggsplitlist,FUN = paste,collapse = ',')
newgat <- gather_(data = agg,key = 'splitcolname','myval',splitcols)
castformula <- as.formula(paste(paste(group,collapse = ' + '),'~','splitcolname','+',splitby))
output <- cast(data = newgat,formula = castformula,value = 'myval')
output
}
res <- jmpsplitcol(x,c('year'),c('engine.disp','model'),c('origin','cylinders'))
head(res2)