我有以下数据框。
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}}。
我不知道如何获取此行和列数据以及如何正确获取差异,以正确获取我的数据。
答案 0 :(得分:1)
如果我的理解正确,那么VORDEN_PREVENT*
列表示以后的销售情况。 OP询问哪一天的累计销售总额超过给定的threshold
。另外,OP希望查看总计达到阈值的销售数字。
我建议以长格式解决此类问题,其中列可以视为数据。
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
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
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
您可以使用您自己的数据替换对象/列的名称。 那是你要找的吗?