我是R的新手,我在问一个非常基本的问题。当然,我在尝试从here和here提供的示例中获取指导时做了我的功课,但是在我的情况下无法实现这个想法,也许是因为我的问题中的比较更大。
我的实际数据有数百列和数百万行,但为了简单起见,我只粘贴了一列感兴趣的列。 "潜力"列可以包含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:我当然尝试了很多我自己的语法,但我没有在这里粘贴,因为它可能会造成不必要的分心。答案 0 :(得分:4)
您可以尝试将data.table
包与shift
和Reduce
功能结合使用。由于您的逻辑有点接近三元数字系统,因此新列可以计算为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