我正在比较不同行的同一列中的值,并且取决于我想要给出的值。 在桌子下面。我有ID,我想获得“结果”列的值。 “我有什么”这一栏是我从我的功能中得到的。 结果条件: 如果ID(n)与(n-1)之前的行的ID不同,则Result(n)为A. 如果ID(n)与之前的行的ID相同并且与下一行(n + 1)不同,则Result(n)是C. 其他案例是B。
l <- ifelse ((df$ID[1:(nrow(df)-1)] != df$ID[2:(nrow(df)+0)]),print("A"),
ifelse(((df$ID[1:(nrow(df)-1)] == df$ID[2:(nrow(df)+0)]) & (df$ID[2:(nrow(df)+0)] != df$ID[3:(nrow(df)+1)])), print ("C"),print ("B")))
df
ID Result What I have
1 12 A A
2 13 A A
3 14 A A
4 15 A B
5 15 B B
6 15 B B
7 15 B B
8 15 B C
9 15 C A
10 16 A NA
11 17 A NA
提前多多感谢
答案 0 :(得分:1)
使用lead
和dplyr
中的ifelse
你可以这样做:
library(dplyr)
df$Result <- ifelse(df$ID != lag(df$ID) | is.na(lag(df$ID)), 'A',
ifelse(df$ID == lag(df$ID) & df$ID != lead(df$ID), 'C', 'B' ))
输出:
> df
ID Result
1 12 A
2 13 A
3 14 A
4 15 A
5 15 B
6 15 B
7 15 B
8 15 B
9 15 C
10 16 A
11 17 A
要澄清的几句话:lag
将列移动1行,而lead
完全相反,即将列向后移1行。检查lag(df$ID)
和lead(df$ID)
是否可视化。
答案 1 :(得分:1)
我们也可以使用rleid
中的data.table
。我们按“ID”变量的游程长度类型ID进行分组。使用逻辑条件创建'Result'变量,即if
元素的数量大于1(.N >1
),我们将'A'连接到'B'和'C'的复制或else
返回'A'。
library(data.table)#v1.9.6+
setDT(df)[, Result:=if(.N>1) c('A', rep('B', .N-2), 'C') else 'A' ,
by = rleid(ID)]
df
# ID Result
# 1: 12 A
# 2: 13 A
# 3: 14 A
# 4: 15 A
# 5: 15 B
# 6: 15 B
# 7: 15 B
# 8: 15 B
# 9: 15 C
#10: 16 A
#11: 17 A
df <- data.frame(ID= c(12:14, rep(15, 6), 16:17))