tidyr或dplyr相当于JMP拆分表

时间:2017-06-12 17:32:21

标签: r dplyr split-apply-combine

JMP有一个"拆分表"平台:
http://www.jmp.com/support/help/Split_Columns.shtml

以下是它的图像:

enter image description here

""拆分"成为列标题的一部分。
"拆分列"列是分散的。
"组"是保留列。

我已经查看了一些链接/页面并且似乎无法在R中实现此功能。现在我必须将其插入到JMP中的宏中。

对我没有帮助的链接包括:

我需要将一个~20k行和~30列的表沿着其中一列(0到13之间的整数)分割成~1400行,~25行分成350.

一个不优雅但可重复的例子是将这个cars表分开 enter image description here

根据这个:
enter image description here

产生这个:
enter image description here

如何使用tidyr或dplyr等R库保留~5个非拆分列?

1 个答案:

答案 0 :(得分:1)

使用重塑,一次做一个拆分列并不太可怕。然后,您可以将model和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)