比较第1栏(第1栏)和第1栏中的连续值。使用col1 post比较结果创建新列(col 2)

时间:2016-05-21 23:45:32

标签: r

我是R的新手,我在问一个非常基本的问题。当然,我在尝试从herehere提供的示例中获取指导​​时做了我的功课,但是在我的情况下无法实现这个想法,也许是因为我的问题中的比较更大。

我的实际数据有数百列和数百万行,但为了简单起见,我只粘贴了一列感兴趣的列。 "潜力"列可以包含1,2或3:

S.No     Potential
 1           -
 2           1
 3           2
 4           3
 5           1
 6           2
 7           3
 8           1
 9           2
10           3
11           3
12           1
13           1
14           2
15           1
16           3
17           2
18           1
19           2
20           2
21           2
22           3
23           1
24           3
25           2
26           3
27           3

我想比较最后一列的值(此处列为“潜力”),以便我将每个[i]行与其前一个[i-1]进行比较,并根据此比较,我希望有一个带有一些预定义值的新列(比如列Challenge)。这是我想要实现的伪代码:

if(Potential[i-1] == 1 && Potential[i] == 1 then Challenge[i] <- 1
if(Potential[i-1] == 1 && Potential[i] == 2 then Challenge[i] <- 2
if(Potential[i-1] == 1 && Potential[i] == 3 then Challenge[i] <- 3

if(Potential[i-1] == 2 && Potential[i] == 1 then Challenge[i] <- 4
if(Potential[i-1] == 2 && Potential[i] == 2 then Challenge[i] <- 5
if(Potential[i-1] == 2 && Potential[i] == 3 then Challenge[i] <- 6

if(Potential[i-1] == 3 && Potential[i] == 1 then Challenge[i] <- 7
if(Potential[i-1] == 3 && Potential[i] == 2 then Challenge[i] <- 8
if(Potential[i-1] == 3 && Potential[i] == 3 then Challenge[i] <- 9

正确的最终输出将是这样的:

 S.No     Potential       Challenge
 1           2                -
 2           1                4
 3           2                2
 4           3                6  
 5           1                7
 6           2                2
 7           3                6
 8           1                so on
 9           2                
10           3                
11           3
12           1
13           1
14           2
15           1
16           3
17           2
18           1
19           2
20           2
21           2
22           3
23           1
24           3
25           2
26           3
27           3

另外,由于我的数据很大,我可以避免循环吗?我非常感谢您对此的指导。非常感谢!

P.S:我当然尝试了很多我自己的语法,但我没有在这里粘贴,因为它可能会造成不必要的分心。

2 个答案:

答案 0 :(得分:4)

您可以尝试将data.table包与shiftReduce功能结合使用。由于您的逻辑有点接近三元数字系统,因此新列可以计算为Potential[i] + 3 * (Potential[i-1] - 1),此处y对应于Potential的滞后值实际上是Potential[i-1]的列。

library(data.table)

DASlaneoverall$Potential <- as.numeric(DASlaneoverall$Potential)
setDT(DASlaneoverall)[, Challenge := Reduce(function(x, y) x + 3 * (y - 1), 
                                shift(Potential, n = 0:1, type = "lag"))]

DASlaneoverall
    S.No Potential Challenge
 1:    1         2        NA
 2:    2         1         4
 3:    3         2         2
 4:    4         3         6
 5:    5         1         7
 6:    6         2         2
 7:    7         3         6
 8:    8         1         7
 9:    9         2         2
10:   10         3         6
11:   11         3         9
12:   12         1         7
13:   13         1         1
14:   14         2         2
15:   15         1         4
16:   16         3         3
17:   17         2         8
18:   18         1         4
19:   19         2         2
20:   20         2         5
21:   21         2         5
22:   22         3         6
23:   23         1         7
24:   24         3         3
25:   25         2         8
26:   26         3         6
27:   27         3         9
    S.No Potential Challenge

答案 1 :(得分:1)

取决于你的逻辑在组合编号方面有多严格,这可能有用:

library(data.table)
dt <- data.table(df)
dt[, previous := shift(Potential)]
dt[order(previous, Potential), group :=  .GRP , by = .(previous, Potential)]

将按相应的顺序为Potential[i-1]Potential[i]的每个组合分配组号:

 dt[order(previous, Potential)]
 #     S.No Potential previous group
 # 1:    2         1        -     1
 # 2:   13         1        1     2
 # 3:    3         2        1     3
 # 4:    6         2        1     3
 # 5:    9         2        1     3
 # 6:   14         2        1     3
 # 7:   19         2        1     3
 # 8:   16         3        1     4