給定data.frame,其中開始和結束表示範圍。將包含範圍的行拆分成多行,數目爲
id start end
1 3 51
2 20 28
我試圖通過25
id start end splitGroup
1 3 25 0
1 25 51 25
2 20 25 0
2 25 28 25
由常規功能相似的劈裂如果範圍包含另一個數字或數字序列,並且將它們分組分割行成多行,例如這裏順序使用plyr包
df <- data.frame(
id = c(1:2),
start = c(3,20),
end = c(51,28)
)
splitBy <- 20
rowSplit <- function(df, splitBy){
newDf <- ddply(df, .(id), function(x){
data.frame(
id = x$id,
start = x$start,
end = x$end,
splitGroup = seq(
floor(x$start/splitBy)*splitBy,
floor(x$end/splitBy)*splitBy,
by=splitBy
)
)
})
newDf <- within(newDf, {
start <- ifelse(
floor(start/splitBy)*splitBy == splitGroup,
start,
splitGroup
)
end <- ifelse(
end < (splitGroup + splitBy),
end,
(splitGroup + splitBy)
)
})
return(newDf)
}
rowSplit(df, splitBy)
id start end splitGroup
1 3 20 0
1 20 40 20
1 40 51 40
2 20 28 20
這怎麼能使用任意數量的辛格運河或不規則組數字
來完成
MOD函數能很好地得到倉的數量。然而,當斷點小於起點時,循環會創建一個新的開始。例如,'df $ start < - 20'和'splitBy < - 5'將給出兩個新的起始數字20和25,而不是一個,20。這可以通過檢查開始是否大於分割數字來避免, newstart [length(newstart)]
junkka
@sbebop好點。我沒有去檢查任何「角落案件」。 –