我想以有效的方式创建左边填充列,具体取决于列的最大元素数。
让我详细说明输入和输出 我的输入数据是:
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
答案 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
保存为paste
。 num.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>