R - разделить значение на суммы в каждом слое - PullRequest
2 голосов
/ 10 апреля 2019

Я озадачен этим. У меня есть начальный набор данных с 2 столбцами: идентификатор и значение.

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вот еще один способ использования data.table и dcast

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)
1 голос
/ 11 апреля 2019

Вы можете сделать это так:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...