Получить данные из строки на основе условия - PullRequest
0 голосов
/ 28 августа 2018

У меня есть следующий фрейм данных.

    SEC VORDEN_PREVENT1  VORDEN_PREVENT2  VORDEN_PREVENT3  VORDEN_PREVENT4 VORDEN_PREVENT5
2484628            1500             1328             2761             3003            2803
2491884            1500             1500             1169             2813            1328
2521158            1500             2813             1328             2761            3003
2548370            1500             1257             2595             1187            1837
2580994            1500             5057             2624             2940            2731
2670164            1500             1874             1218             2791            2892

В этом информационном кадре в качестве VORDEN_PREVENT* указано количество автомобилей, проданных за день, например, VORDEN_PREVENT1 означает, что я продал в этот день 1500 автомобилей, и я хочу вернуть столбцы из строк, которые производят покупку например 3000 автомобилей.

Для этого примера должно быть 1500 от VORDEN_PREVENT1, 1328 от VORDEN_PREVENT2 и 172 от VORDEN_PREVENT3, что является разницей от 2761 и суммы от VORDEN_PREVENT1 и VORDEN_PREVENT2.

Я не знаю, как получить эти данные строки и столбца и правильно определить разницу, чтобы получить мои данные правильно.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Если я правильно понимаю, столбцы VORDEN_PREVENT* обозначают продажи в последующие дни. ОП спрашивает, в какой день совокупная сумма продаж превышает заданную threshold. Кроме того, ОП хочет видеть цифры продаж, которые суммируются до порога.

Предлагаю решить этот тип вопросов в длинном формате, где столбцы можно рассматривать как данные.

1. melt() / dcast()

library(data.table)
threshold <- 3000L
long <- melt(setDT(DT), id.var = "SEC")
long[, value := c(value[1L], diff(pmin(cumsum(value), threshold))), by = SEC]
dcast(long[value > 0], SEC ~ variable)
       SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3
1: 2484628            1500            1328             172
2: 2491884            1500            1500              NA
3: 2521158            1500            1500              NA
4: 2548370            1500            1257             243
5: 2580994            1500            1500              NA
6: 2670164            1500            1500              NA

2. gather() / spread()

library(tidyr)
library(dplyr)
threshold <- 3000L
DT %>% 
  gather(, , -SEC) %>% 
  group_by(SEC) %>% 
  mutate(value = c(value[1L], diff(pmin(cumsum(value), threshold)))) %>% 
  filter(value >0) %>% 
  spread(key, value)
# A tibble: 6 x 4
# Groups:   SEC [6]
      SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3
    <int>           <int>           <int>           <int>
1 2484628            1500            1328             172
2 2491884            1500            1500              NA
3 2521158            1500            1500              NA
4 2548370            1500            1257             243
5 2580994            1500            1500              NA
6 2670164            1500            1500              NA

3. apply()

С основанием R:

DT[, -1] <- t(apply(DT[, -1], 1, function(x) c(x[1L], diff(pmin(cumsum(x), threshold)))))
DT
      SEC VORDEN_PREVENT1 VORDEN_PREVENT2 VORDEN_PREVENT3 VORDEN_PREVENT4 VORDEN_PREVENT5
1 2484628            1500            1328             172               0               0
2 2491884            1500            1500               0               0               0
3 2521158            1500            1500               0               0               0
4 2548370            1500            1257             243               0               0
5 2580994            1500            1500               0               0               0
6 2670164            1500            1500               0               0               0

Данные

library(data.table)
DT <- fread("
    SEC VORDEN_PREVENT1  VORDEN_PREVENT2  VORDEN_PREVENT3  VORDEN_PREVENT4 VORDEN_PREVENT5
2484628            1500             1328             2761             3003            2803
2491884            1500             1500             1169             2813            1328
2521158            1500             2813             1328             2761            3003
2548370            1500             1257             2595             1187            1837
2580994            1500             5057             2624             2940            2731
2670164            1500             1874             1218             2791            2892",
data.table = FALSE)
0 голосов
/ 28 августа 2018

Ваш вопрос мне не очень понятен, поэтому я сведу его к тому, что понимаю (вы хотите создать столбец, а затем отфильтровать по строкам). Используя dplyr, это можно сделать довольно легко, но сначала мы воссоздаем некоторые данные.

# recreate some data
df <- data.frame(time=1:3,
                 sales1=c(1234, 1567, 2045),
                 sales2=c(865, 756, 890))

# first create a diff column
df <- df %>% mutate(sales_diff=sales1-sales2)

df
time sales1 sales2 sales_diff
   1   1234    865        369
   2   1567    756        811
   3   2045    890       1155

# then you can access the rows you're interested in by filtering them
df %>% filter(sales1==1567)

time sales1 sales2 sales_diff
   2   1567    756        811

Вы можете просто заменить имена объектов / столбцов собственными данными. Это то, что вы искали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...