如何在R中的串联字符串上使用Pivottabler

时间:2018-08-09 16:36:52

标签: r

我有一个看起来像这样的表-

LDAutGroup  PatientDays ExposedDays sex    Ageband    DrugGroup Prop    LowerCI UpperCI concat
Group1            100        23       M    5 to 10      PSY      23       15.84   32.15  23 (15.84 -32.15)    F
Group2            500        56       F    11  to 17    HYP      11.2      8.73   14.27  11.2 (8.73 -14.27)
Group3            300        89       M    18 and over  PSY      29.67    24.78   35.07  29.67 (24.78 -35.07)
Group1            200        34       F    5 to 10      PSY      17       12.43   22.82  17 (12.43 -22.82)
Group2            456        78       M    11 to 17     ANX      17.11    13.93   20.83  17.11 (13.93 -20.83)

在此之后,我希望数据透视表将concat列布置为valuename。但是,数据透视表仅适用于整数或数字值。以下代码可以单独与Prop,LowerCI或UpperCI列一起运行,但会为concat列提供错误消息-

library(readr)
library(dplyr)
library(epitools)
library(gtools)
library(reshape2)
library(binom)
library(pivottabler)    
pt <- PivotTable$new()
    pt$addData(a)
    pt$addColumnDataGroups("LDAutGroup")
    pt$addColumnDataGroups("sex")
    pt$addRowDataGroups("DrugGroup")
    pt$addRowDataGroups("Ageband")
    pt$defineCalculation(calculationName="TotalTrains", type="value", valueName="Prop")
    pt$renderPivot()

有什么办法可以使concat列上的工作吗?我想要一个具有以下布局的表,并在上面的表的concat列中填充包含字符串的单元格

                     Group1     Group2      Group3  
                      M   F     M    F      M    F
ANX 11 to 17                        
    18 and over                     
    Total                       
HYP 11  to 17                       
    18 and over                     
    5 to 10                     
    Total                       
PSY 18 and over                     
    5 to 10                     
    Total       

2 个答案:

答案 0 :(得分:0)

对于CI(下限或上限)应用相同的功能是推测性的,因为它可能用于均值统计报告小计水平,而concat报告小计没有意义(至少以简单的数据透视表方式) )。 没有小计,您可以轻松使用tidyr库并使用表的扩展格式报告字符类型的变量:这是2行代码。首先是为列创建组,第二行是将表格式更改为传播版本

library(tidyr)

Table_Original <- unite(Table_Original, "Col_pivot", c("LDAutGroup", "sex"), sep = "_", remove = F)
Table_Pivot <- spread(Table_Original[ ,c("Col_pivot","DrugGroup", "Ageband", "concat")], Col_pivot, concat)

答案 1 :(得分:0)

我是数据透视表包的作者。

正如您所说,pivottabler当前仅旋转整数/数字列。但是,存在一种解决方法,使用自定义单元格计算功能来计算每个单元格中的值。自定义计算功能旨在用于更复杂的用例,因此以这种方式使用它们是一种大锤方法,但确实可以完成工作,并且我认为在某些情况下是有意义的,例如如果您还有其他数字数据透视表,并且希望输出中的数据透视表具有统一的外观。

通过小插图改编示例:

library(pivottabler)
library(dplyr)

trainsConcatendated <- mutate(bhmtrains, ConcatValue = paste(TOC, TrainCategory, sep=" "))

getConcatenatedValue <- function(pivotCalculator, netFilters, format, baseValues, cell) {
  # get the data frame
  trains <- pivotCalculator$getDataFrame("trainsConcatendated")
  # apply the filters coming from the headers in the pivot table
  filteredTrains <- pivotCalculator$getFilteredDataFrame(trains, netFilters)
  # get the distinct values
  distinctValues <- distinct(filteredTrains, ConcatValue)
  # get the value of the concatenated column
  # this just returns the first concatenated value for the cell
  # if there are multiple values, the others are ignored
  if(length(distinctValues$ConcatValue)==0) { tv <- "" }
  else { tv <- distinctValues$ConcatValue[1] }
  # build the return value
  # the raw value must be numerical, so simply set this to zero
  value <- list()
  value$rawValue <- 0
  value$formattedValue <- tv
  return(value)
}

pt <- PivotTable$new()
pt$addData(trainsConcatendated)
pt$addColumnDataGroups("TrainCategory", addTotal=FALSE)
pt$addRowDataGroups("TOC", addTotal=FALSE)
pt$defineCalculation(calculationName="ConcatValue", 
                     type="function", calculationFunction=getConcatenatedValue)
pt$renderPivot()

结果:

enter image description here