r - 按任意数字将包含范围的行拆分为多行

标签 r plyr

给定一个 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/

相关文章:

r - 在 R 中绘制的轴(x 轴)中的希腊字母序列

r - R中的data.frame对象到xts对象的转换

R 示例 - ddply、ave 和合并

r - 使用 ddply 进行汇总统计

将三列数据框 reshape 为矩阵 ("long"到 "wide"格式)

r - R中带有轮廓的文本标签

r - 如何用R中的另一个字符串替换由开始和结束索引定义的字符串?

r - 使用 ggplot2 沿平滑曲线绘制直方图或密度

r - 将模拟泊松分布添加到 ggplot

r - R中治疗组和地点的多样性指数