首页 文章

比较第1列(第1列)中的连续值和使用col1后期比较结果创建新列(第2列)

提问于
浏览
2

我是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

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

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 回答

  • 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

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

    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
    

相关问题