给定一个 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 函数的开始:
smod <- df$start%/%25 # 0 0
emod<-df$end%/%25 # 2 1
newstart<-numeric(0)
matchit<-25*(1:100) # or at least extend to maximum value in your dataframe
for (j in 1:2) { newstart<-c(newstart,df$start[j])
if(emod[j]>0) newstart<-c(newstart, min(matchit[matchit>df$start[j]])) }
Rgames> newstart
[1] 3 25 20 25
以类似的方式计算newend
,你应该设置好了。
关于r - 按任意数字将包含范围的行拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087812/