R - 如何在条件下将顺序列添加到数据框?

R - How to add sequential columns to dataframe on conditional?

我有一个数据框:

         from     to    color
    1   54770  54771 darkgrey
    2   54770  54775 darkgrey
    3   54770  54776 darkgrey
    4   54770  54774 darkgrey
    5   54771  54775 darkgrey
    6   54771  54776 darkgrey
    7   54771  54774      red
    8   54775  54776 darkgrey
    9   54775  54774 darkgrey
    10  54776  54774 darkgrey
    11 110780 110781 darkgrey
    12 110780 110783 darkgrey
    13 110780 110784 darkgrey
    14 110780 110782 darkgrey
    15 110781 110783 darkgrey
    16 110781 110784 darkgrey
    17 110781 110782 darkgrey
    18 110783 110784 darkgrey
    19 110783 110782 darkgrey
    20 110784 110782 darkgrey
    21  20285  20286 darkgrey
    22  20285  20287 darkgrey
    23  20285  20692      red
    24  20285  20693      red
    25  20286  20287 darkgrey
    26  20286  20692 darkgrey
    27  20286  20693 darkgrey
    28  20287  20692 darkgrey
    29  20287  20693 darkgrey
    30  83962  83963 darkgrey
    31  83962  83964 darkgrey
    32  83962  83960 darkgrey
    33  83962  83961      red
    34  83963  83964 darkgrey
    35  83963  83960 darkgrey
    36  83963  83961 darkgrey
    37  83964  83960      red
    38  83964  83961 darkgrey
    39  88564  88565 darkgrey
    40  88824  88825 darkgrey
    41  88824  88826 darkgrey
    42  88824  88565 darkgrey
    43  88825  88826 darkgrey
    44  88825  88565      red
    45  88826  88565 darkgrey
    46  72276  72272      red
    47  72276  72273 darkgrey
    48  72276  72274 darkgrey
    49  72276  72275 darkgrey
    50 111062 111058 darkgrey
    51 111062 111059 darkgrey
    52 111062 111060      red
    53 111062 111061 darkgrey
    54 111074 111070      red
    55 111074 111071      red
    56 111074 111072 darkgrey
    57 111074 111073 darkgrey

我想添加另外两列,它们是序列号,分为一组奇数和偶数,像这样到这个数据框:

         from     to    color  f  t
    1   54770  54771 darkgrey
    2   54770  54775 darkgrey
    3   54770  54776 darkgrey
    4   54770  54774 darkgrey
    5   54771  54775 darkgrey
    6   54771  54776 darkgrey
    7   54771  54774      red  1  2
    8   54775  54776 darkgrey
    9   54775  54774 darkgrey
    10  54776  54774 darkgrey
    11 110780 110781 darkgrey
    12 110780 110783 darkgrey
    13 110780 110784 darkgrey
    14 110780 110782 darkgrey
    15 110781 110783 darkgrey
    16 110781 110784 darkgrey
    17 110781 110782 darkgrey
    18 110783 110784 darkgrey
    19 110783 110782 darkgrey
    20 110784 110782 darkgrey
    21  20285  20286 darkgrey
    22  20285  20287 darkgrey
    23  20285  20692      red  3  4
    24  20285  20693      red  5  6
    25  20286  20287 darkgrey
    26  20286  20692 darkgrey
    27  20286  20693 darkgrey
    28  20287  20692 darkgrey
    29  20287  20693 darkgrey
    30  83962  83963 darkgrey
    31  83962  83964 darkgrey
    32  83962  83960 darkgrey
    33  83962  83961      red  7  8
    34  83963  83964 darkgrey
    35  83963  83960 darkgrey
    36  83963  83961 darkgrey
    37  83964  83960      red  9 10
    38  83964  83961 darkgrey
    39  88564  88565 darkgrey
    40  88824  88825 darkgrey
    41  88824  88826 darkgrey
    42  88824  88565 darkgrey
    43  88825  88826 darkgrey
    44  88825  88565      red 11 12
    45  88826  88565 darkgrey
    46  72276  72272      red 13 14
    47  72276  72273 darkgrey
    48  72276  72274 darkgrey
    49  72276  72275 darkgrey
    50 111062 111058 darkgrey
    51 111062 111059 darkgrey
    52 111062 111060      red 15 16
    53 111062 111061 darkgrey
    54 111074 111070      red 17 18
    55 111074 111071      red 19 20
    56 111074 111072 darkgrey
    57 111074 111073 darkgrey

我想将空的留给 NA(我在上面的 df 中将它们遗漏了)。

我可以使用 which 获取要更新的行的索引:

which(df$color == "red")
 [1]  7 23 24 33 37 44 46 52 54 55

我可以根据这个创建两个奇数和偶数序列:

odd <- seq(from = 1, to = 2*length(which(cluster_data_updated_illegal_combined$color == "red")), by = 2)
even <- seq(from = 2, to = 2*length(which(cluster_data_updated_illegal_combined$color == "red")), by = 2)
> odd
 [1]  1  3  5  7  9 11 13 15 17 19
> even
 [1]  2  4  6  8 10 12 14 16 18 20

但我如何将这些组合起来以添加上面的序号?

先把所有的列都填满NA。

df$f = NA
df$t = NA

然后使用 which 更新必要的行

df$f[which(df$color == "red")] = odd
df$t[which(df$color == "red")] = even

初始化空列后,

df$f <- NA
df$n <- NA

您可以使用尺寸正确的矩阵作为 color=="red":

两列的掩码
red_matrix <- matrix(1:(length(which(df$color == "red")) *2), ncol = 2, byrow = TRUE )
df[df$color == "red", c("f","n")] <- length_red