R中的填充序列

时间:2017-08-09 17:49:41

标签: r

我想以有效的方式创建左边填充列,具体取决于列的最大元素数。

让我详细说明输入和输出 我的输入数据是:

input <- data.frame(path=c("2","4,3,4","3,1"))
input
   path
1     2
2 4,3,4
3   3,1

预期产出:

  V1 V2 V3
1  0  0  2
2  4  3  4
3  0  3  1

输入的逻辑基础是:

1 - 我们查看具有最大元素的行(在此示例中它是3,因为我们在行号2中有4,3,4)我们现在知道我们将需要创建3列作为输出

2 - 对于没有3个元素的行,我们回填0。 由于第一行只有1个元素,我需要将两列放在0 对于第二行,我可以直接填充所有列,因为我们有三个元素,对于最后一行,我有2个元素,所以我需要回填一个0.

我尝试做的工作但很脏

input$path <- as.character(input$path)
lst <- strsplit(input$path, ",")
column_to_create <- max(lengths(lst))
output <- list()
i <- 1
for(i in 1:length(lst)){
  if (length(lst[[i]]) < column_to_create) {

    nb_create <- column_to_create - length(lst[[i]])
    output[[i]] <- c(rep(0,nb_create),lst[[i]])
  }
  else{
    output[[i]] <- lst[[i]]
  }

}
output <- lapply(output,as.numeric)
do.call(rbind,output)

     [,1] [,2] [,3]
[1,]    0    0    2
[2,]    4    3    4
[3,]    0    3    1

1 个答案:

答案 0 :(得分:1)

这是tidyverse解决方案

library(tidyverse)

input %>%
  separate(path, into=c("V1","V2","V3"), ",", fill="left") %>%
  replace(is.na(.), 0)

separate ,分为三列,fill左侧NA如果篇幅不够,请将 V1 V2 V3 1 0 0 2 2 4 3 4 3 0 3 1 替换为0

输出

strsplit

----------------------------------------------- -----------------------------------------

对未知列数进行推广

遍历每一行,确定max后的向量长度,并将num.cols保存为pastenum.cols <- max(sapply(1:nrow(input), function(x) length(unlist(strsplit(as.character(input$path[x]), ","))))) new.cols <- paste0("V", 1:num.cols) 个新列名称

new.cols

现在您可以使用input %>% separate(path, into=new.cols, ",", fill="left") %>% replace(is.na(.), 0) 来定义列名

<%@taglib prefix="sj"   uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg"  uri="/struts-jquery-grid-tags"%>
<script type="text/javascript" src="myjs/jquery.jqGrid.min.js" ></script>

<sjg:grid
        id          ="gridAssistance"                       gridModel   ="gridAssistance"
        href        ="ajaxLlenarTablaAssistance"            dataType    ="json"        
        caption     ="Detalle de Asistencia"                altRows     ="true"                             
        pager       ="true"                                 pagerInput  ="false"
        pagerButtons="true"                                 rowList     ="10,15,20,25,30"
        rowNum      ="10"                                   rownumbers  ="true"
        navigator   ="true"                                 viewrecords ="true"
        hidegrid    ="false"                                multiselect ="false"
        navigatorRefresh="false"                            navigatorSearch="false"             
        resizable   ="true"                                 

    >
                <sjg:gridColumn id="idProm" name="idProm"   title="ID PROMOVENDEDOR"        index="idProm"      sortable="false"    />
                <sjg:gridColumn id="name" name="name"   title="NOMBRE"      index="name"        sortable="false"    width="150" />
                <sjg:gridColumn id="puesto" name="puesto"   title="PUESTO"      index="puesto"      sortable="false"    width="100"/>
                <sjg:gridColumn id="idStore" name="idStore" title="ID TIENDA"       index="idStore"     sortable="false"    width="5"/>
                <sjg:gridColumn id="storeName" name="storeName" title="NOMBRE DE LA TIENDA"         index="storeName"       sortable="false"    width="150" />
                <sjg:gridColumn id="description" name="description" title="DESCRIPCIÓN"         index="description"     sortable="false"    width="100"/>
                <sjg:gridColumn id="week" name="week"   title="SEMANA"      index="week"        sortable="false"    width="50"/>
                <sjg:gridColumn id="date" name="date"   title="FECHA"       index="date"        sortable="false"    width="50"/>
                <sjg:gridColumn id="event" name="event" title="EVENTO"      index="event"       sortable="false"    width="50" />

                </sjg:grid>