比较同一列中的值,并将结果添加到R中的第二列

时间:2015-09-26 11:33:31

标签: r

我正在比较不同行的同一列中的值,并且取决于我想要给出的值。 在桌子下面。我有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

提前多多感谢

2 个答案:

答案 0 :(得分:1)

使用leaddplyr中的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))