如何根据组和组第一行中的值定义行编号?

时间:2019-08-01 13:09:47

标签: r dataframe

数据帧DD缺少一些行。根据“ ID_raw”列中的值,我复制了这些行以替换丢失的行。现在,我必须对行进行编号,以使每个组(列“ File”)中的第一个值等于“ ID_raw”列中同一行中的值。这将是将数据框与另一个连接的关键。在DD数据框的虚拟示例下面:

DD<-data.frame(ID_raw=c(1,5,7,8,5,7,9,13,3,6),Val=c(1,2,8,15,54,23,88,77,32,2),File=c("A","A","A","A","B","B","B","B","C","C"))
   ID_raw Val File
1       1   1    A
2       5   2    A
3       7   8    A
4       8  15    A
5       5  54    B
6       7  23    B
7       9  88    B
8      13  77    B
9       3  32    C
10      6   2    C

到目前为止,我已经成功地复制了行,但是,在以这种方式对行进行编号时存在一个问题,即它们的起始值与每个组(“文件”)的ID_raw列中的值相同。

DD$ID_diff <- 0
DD$ID_diff[1:nrow(DD)-1] <- as.integer(diff(DD$ID_raw, 1)) #values which tell how many times a row has to be duplicated
DD$ID_diff <- sapply(DD$ID_diff, function(x) ifelse(x<0, 0, x)) #replacement the values <0 (for the first rows in each 'File' group)
DD <- DD[rep(seq(nrow(DD)), DD$ID_diff), 1:ncol(DD)] #rows duplication

基于上面的代码,我收到以下输出:

    ID_raw Val File ID_diff
1        1   1    A       4
1.1      1   1    A       4
1.2      1   1    A       4
1.3      1   1    A       4
2        5   2    A       2
2.1      5   2    A       2
3        7   8    A       1
5        5  54    B       2
5.1      5  54    B       2
6        7  23    B       2
6.1      7  23    B       2
7        9  88    B       4
7.1      9  88    B       4
7.2      9  88    B       4
7.3      9  88    B       4
9        3  32    C       3
9.1      3  32    C       3
9.2      3  32    C       3

我想收到这个:

    ID_raw Val File ID_diff ID_new
1        1   1    A       4      1
1.1      1   1    A       4      2
1.2      1   1    A       4      3
1.3      1   1    A       4      4
2        5   2    A       2      5
2.1      5   2    A       2      6
3        7   8    A       1      7
5        5  54    B       2      5
5.1      5  54    B       2      6
6        7  23    B       2      7
6.1      7  23    B       2      8
7        9  88    B       4      9
7.1      9  88    B       4      10
7.2      9  88    B       4      11
7.3      9  88    B       4      12
9        3  32    C       3      3
9.1      3  32    C       3      4
9.2      3  32    C       3      5

2 个答案:

答案 0 :(得分:2)

这是根据您的代码输出使用dplyr的一个选项:

df %>%
  group_by(File) %>%
  mutate(ID_new = seq(1, n()) + first(ID_raw) - 1)

# A tibble: 18 x 5
# Groups:   File [3]
   ID_raw   Val File  ID_diff ID_new
    <int> <int> <fct>   <int>  <dbl>
 1      1     1 A           4      1
 2      1     1 A           4      2
 3      1     1 A           4      3
 4      1     1 A           4      4
 5      5     2 A           2      5
 6      5     2 A           2      6
 7      7     8 A           1      7
 8      5    54 B           2      5
 9      5    54 B           2      6
10      7    23 B           2      7
11      7    23 B           2      8
12      9    88 B           4      9
13      9    88 B           4     10
14      9    88 B           4     11
15      9    88 B           4     12
16      3    32 C           3      3
17      3    32 C           3      4
18      3    32 C           3      5

答案 1 :(得分:1)

我们可以从一开始就在链中进行此操作,即不用创建'ID_diff'并使用heat.exe,而是直接在'ID_raw'上使用sapply,然后使用diff,按“文件”分组,创建序列列

uncount