如何将数据框架与因子作为变量进行比较?

时间:2017-05-22 10:42:05

标签: r

我有一个数据框,请参阅下文。 如何比较Purchase == 1与上一个Purchase == 1音量的音量,并创建V1中显示的因子变量Picture 2

df[5,"V1"] == 1因为df[5,"Volume"] > df[3,"Volume"] ....等等。

如何在不使用循环的情况下实现这一目标,如何实现矢量化方式,以便计算速度更快(处理数百万行时)?

我尝试了子设置,然后进行比较但是当试图将它们放回到因子变量时,结果的行数与df的行数不同因此我不能将因子变量放到数据帧中。

图片2

       Volume  Weight Purchase     V1
1     3.95670 5.27560        0      0
2     3.97110 5.29280        0      0
3     3.97200 5.29120        1      0
4     3.98640 5.31160        0      0
5     3.98880 5.31240        1      1
6     3.98700 5.31040        0      0
7     3.98370 5.31080        0      0
8     3.98580 5.31400        0      0
9     3.98670 5.31120        1      0
10    3.98460 5.29040        0      0
11    3.97710 5.28920        0      0
12    3.96720 5.26080        1      0
13    3.95190 5.26520        0      0
14    3.95160 5.26840        0      0
15    3.95340 5.26360        1      0
16    3.95370 5.23600        1      1
17    3.93450 5.23480        0      0
18    3.93480 5.23640        1      0
19    3.92760 5.23600        0      0
20    3.92820 5.22960        1      0

1 个答案:

答案 0 :(得分:2)

使用data.table:

library(data.table)
data <- data.table(read.table(text='       Volume  Weight Purchase     V1
                              1     3.95670 5.27560        0      0
                              2     3.97110 5.29280        0      0
                              3     3.97200 5.29120        1      0
                              4     3.98640 5.31160        0      0
                              5     3.98880 5.31240        1      1
                              6     3.98700 5.31040        0      0
                              7     3.98370 5.31080        0      0
                              8     3.98580 5.31400        0      0
                              9     3.98670 5.31120        1      0
                              10    3.98460 5.29040        0      0
                              11    3.97710 5.28920        0      0
                              12    3.96720 5.26080        1      0
                              13    3.95190 5.26520        0      0
                              14    3.95160 5.26840        0      0
                              15    3.95340 5.26360        1      0
                              16    3.95370 5.23600        1      1
                              17    3.93450 5.23480        0      0
                              18    3.93480 5.23640        1      0
                              19    3.92760 5.23600        0      0
                              20    3.92820 5.22960        1      0', header=T))
data[, V1 := 0]
data[Purchase == 1, V1 := as.integer(Volume > shift(Volume)) ]
data[, V1 := as.factor(V1)]

在这里,我将数据过滤到Purchase = 1,然后我带了前一个带有shift功能的Volume。 最后,我将Volume与Previous卷进行了比较,如果Volume大于Previous,则分配1。