Есть ли способ создать уникальные корзины для каждой строки данных? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть набор данных с минимальной и максимальной высотой для нескольких объектов. Фрейм данных выглядит следующим образом:

ID Min Max  
A  30  160  
B  12  200  
C  35  171  
D  16  198 

Я хочу разделить расстояние между минимальным и максимальным, чтобы создать 3 ячейки "Bottom", "Middle" и "Top". Я хочу, чтобы ящики представляли 1/3 диапазона между Мин и Макс. Это мой ожидаемый результат (десятичные числа в порядке, я просто округляю здесь):

ID Bottom Middle Top   
A  30-73  74-116 117-160  
B  12-75  76-137 138-200  
C  35-80  81-125 126-171  
D  16-77  78-138 139-198

Есть ли способ сделать это в dplyr?

Кроме того, я буду использовать диапазоны созданный из этих контейнеров для сравнения с другим, отдельным набором данных, отслеживающим движение частиц для каждого уникального идентификатора в этих диапазонах. Я хочу знать, как часто каждая частица была в «Нижнем», «Среднем» или «Верхнем». Есть ли способ сделать это с отдельными файлами, или я должен как-то объединить их?

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Вот базовое решение R путем определения пользовательской функции f

f <- Vectorize(function(l,u) {
  ur <- round((u-l)/3*(1:3)+l)
  lr <- c(l,ur[1:2]+1)
  paste(lr,ur,sep = "-")
})

dfout <- cbind(df[1],
               `colnames<-`(t(f(df$Min,df$Max)),c("Bottom","Middle","Top")))

, такой что

> dfout
  ID Bottom Middle     Top
1  A  30-73 74-117 118-160
2  B  12-75 76-137 138-200
3  C  35-80 81-126 127-171
4  D  16-77 78-137 138-198

DATA

df <- structure(list(ID = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), Min = c(30, 12, 35, 16), Max = c(160, 
200, 171, 198)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 23 марта 2020
    library(dplyr)
    library(stringr)

    dataset <- data.frame(ID = c("A", "B", "C", "D"),
                          Min = c(30, 12, 35, 16),
                          Max = c(160, 200, 171, 198))

    datasetBins <- dataset %>%
# Getting bins limits (using floor() to make them separable)
      mutate(quater = (Max - Min) / 3) %>%
      mutate(limit2 = floor(Min + quater),
             limit3 = floor(Min + 2* quater)) %>%
# Creating bins (using +1 to make them separable)
      mutate(Bottom = str_c(Min, limit2, sep = "-"),
             Middle = str_c(limit2+1, limit3, sep = "-"),
             Top = str_c(limit3+1, Max, sep = "-")) %>%
# Droping redundant cols
      select(ID, Bottom, Middle, Top)

В качестве альтернативы, если вы хотите, чтобы этот кадр данных был полезен при сравнении с числовыми значениями, я бы остановился на вычислении пределов. Затем вы можете использовать ifelse() для проверки последовательных пределов, чтобы поместить данное значение в соответствующую ячейку.

...