根据条件从行获取数据

时间:2018-08-28 12:42:46

标签: r loops

我有以下数据框。

    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辆汽车的购买。

例如,应该是VORDEN_PREVENT1的1500,VORDEN_PREVENT2的1328和VORDEN_PREVENT3的172,这是与2761的差以及与VORDEN_PREVENT1和{ {1}}。

我不知道如何获取此行和列数据以及如何正确获取差异,以正确获取我的数据。

2 个答案:

答案 0 :(得分:1)

如果我的理解正确,那么VORDEN_PREVENT*列表示以后的销售情况。 OP询问哪一天的累计销售总额超过给定的threshold。另外,OP希望查看总计达到阈值的销售数字。

我建议以长格式解决此类问题,其中列可以视为数据。

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)

答案 1 :(得分:0)

您的问题对我来说不是很清楚,因此我将其简化为我的理解(您要创建一列,然后对行进行过滤)。使用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

您可以使用您自己的数据替换对象/列的名称。 那是你要找的吗?