我是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
我想比较最后一列的值(这里列为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 回答
您可以尝试将
data.table
包与shift
和Reduce
功能结合使用 . 由于您的逻辑有点接近三元数字系统,因此新列可以计算为Potential[i] + 3 * (Potential[i-1] - 1)
,这里y
对应于Potential
列的滞后值,实际上是Potential[i-1]
.取决于您在组合编号方面的逻辑有多严格,这可能有效:
组编号将按相应的顺序分配给
Potential[i-1]
和Potential[i]
的每个组合: