【问题标题】:R - split a value into the amounts within each layerR - 将一个值拆分为每一层内的数量
【发布时间】:2019-04-10 18:56:09
【问题描述】:

我被这个难住了。我有一个包含 2 列的起始数据集:一个 ID 和一个值。

df <- data.frame(id = c('ABC','XYZ'),
             value = c(150, 300))

然后我定义我想如何“分层”这些值(在这种情况下,我想将值分成 100 层)。

cut <- seq(0, 300, 100)

因此,对于数据集的第一条记录,值为 150。我想将其拆分为 0-100、100-200 和 200-300 范围内的数量。

起始数据集

 id value
ABC   150
XYZ   300

结束数据集(定义cut后)

 id value val_0_100 val_100_200 val_200_300
ABC   150       100          50           0
XYZ   300       100         100         100

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以这样做:

    df <- data.frame(id = c('ABC','XYZ'),
                     value = c(150, 300))
    
    initial_value = 0
    final_value = 300
    step = 100
    number_of_columns = ceiling(final_value / step)  
    
    for (i in 1:number_of_columns){
      new_col_name <- paste0("val_", step*(i-1), "_", step*i)
      df[,new_col_name] = apply(df["value"] - (step*(i-1)),1, FUN=min,100)
      df[,new_col_name] = apply(df[new_col_name],1, FUN=max,0)
    }
    

    【讨论】:

      【解决方案2】:

      这是使用data.tabledcast 的另一种方式

      library(data.table)
      df <- data.frame(id = c('ABC','XYZ'),
                       value = c(160, 230))
      
      # Data table
      dt <- data.table(df)
      
      # Append Data multiple times based on its value
      dt <- dt[rep(seq_len(nrow(dt)), ceiling(dt$value/100)), ]
      
      # cumulative sum to be used in splitting into columns in dcast
      dt[, csum := 100]
      dt[, csum := cumsum(csum), by = "id"]
      
      # Adding extra column to split into 100s and remainder
      dt[, value2 := 100]
      dt[csum > value, value2 := value %% 100]
      dt[value < 100, value2 := value]
      
      dt_dcast <- dcast(dt, id + value ~ csum, value.var = "value2", fill = 0)
      
      # Rename columns as per the example shown above
      colstart <- seq(0, max(dt$csum) - 100, 100)
      colend <- seq(100, max(dt$csum), 100)
      newname <- c("id", "value", paste0("val_",  colstart, "_", colend))
      setnames(dt_dcast, names(dt_dcast), newname)
      

      【讨论】:

        猜你喜欢
        • 2018-05-13
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        相关资源
        最近更新 更多