R中的填充序列
我想根据列中元素的最大数量高效地创建左填充列 让我详细介绍一下输入和输出 我的输入数据如下:R中的填充序列,r,R,我想根据列中元素的最大数量高效地创建左填充列 让我详细介绍一下输入和输出 我的输入数据如下: input <- data.frame(path=c("2","4,3,4","3,1")) input path 1 2 2 4,3,4 3 3,1 基于输入的逻辑为: 1-我们看一下这个例子中最大元素的行,它是3,因为第2行中有4,3,4,我们现在知道我们需要创建3列作为输出 2-对于没有3个元素的行,我们使用0进行回填。 因为第一行只有1个元素,所以我需要用0放置两列 对
input <- data.frame(path=c("2","4,3,4","3,1"))
input
path
1 2
2 4,3,4
3 3,1
基于输入的逻辑为:
1-我们看一下这个例子中最大元素的行,它是3,因为第2行中有4,3,4,我们现在知道我们需要创建3列作为输出
2-对于没有3个元素的行,我们使用0进行回填。
因为第一行只有1个元素,所以我需要用0放置两列
对于第二行,我可以直接填充所有列,因为我们有三个元素,对于最后一行,我有两个元素,所以我需要回填一个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
这是一个整洁的解决方案
分开,分成三列,如果没有足够的碎片,则向左填充,将NA替换为0
输出
--------------------------------------------
未知列数的泛化
迭代每一行,在strsplit之后确定向量的长度,并将最大值保存为num.cols。粘贴新列名
num.cols <- max(sapply(1:nrow(input), function(x) length(unlist(strsplit(as.character(input$path[x]), ",")))))
new.cols <- paste0("V", 1:num.cols)
input %>%
separate(path, into=new.cols, ",", fill="left") %>%
replace(is.na(.), 0)
V1 V2 V3
1 0 0 2
2 4 3 4
3 0 3 1
num.cols <- max(sapply(1:nrow(input), function(x) length(unlist(strsplit(as.character(input$path[x]), ",")))))
new.cols <- paste0("V", 1:num.cols)
input %>%
separate(path, into=new.cols, ",", fill="left") %>%
replace(is.na(.), 0)