简体   繁体   English

R - 如何有条件地将连续列添加到数据框?

[英]R - How to add sequential columns to dataframe on conditional?

I have a dataframe:我有一个数据框:

         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

I want to add two other columns which are sequential numbers, separated into a set of odd and even numbers, to this dataframe like this:我想向这个数据帧添加另外两列,它们是序列号,分为一组奇数和偶数,如下所示:

         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

I'd like to leave the empty ones with NA (I've left them out in the above df).我想用 NA 留下空的(我在上面的 df 中将它们排除在外)。

I can use which to get the index of the rows which I want to update:我可以使用which来获取要更新的行的索引:

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

And I can create two odd and even sequences based on this:我可以基于此创建两个奇数和偶数序列:

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

But how do I combine these to add the sequential numbers above?但是我如何组合这些来添加上面的序列号?

First fill up the columns with NA all the way.首先用 NA 填充列。

df$f = NA
df$t = NA

Then use the which to update the necessary rows然后使用 which 来更新必要的行

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

After initializing the empty columns,初始化空列后,

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

You could use a matrix with the correct dimensions as a mask for the two columns where color=="red" :您可以使用具有正确尺寸的矩阵作为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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM