在数据框中创建 "Ascending ID"

Create "Ascending ID" in a Data Frame

我在 R 中有这个数据:

column1 = c("A", "B", "C")

column2 = c("AA", "BB", "CC", "DD")

column3 = c("AAA")


na.pad <- function(x,len){
    x[1:len]
}

makePaddedDataFrame <- function(l,...){
    maxlen <- max(sapply(l,length))
    data.frame(lapply(l,na.pad,len=maxlen),...)
}


d = makePaddedDataFrame(list(x=column1,y=column2,z=column3))

     x  y    z
1    A AA  AAA
2    B BB <NA>
3    C CC <NA>
4 <NA> DD <NA>

在上面的例子中:

你可以试试:

d[paste0(names(d), "_id")] <- cumsum(c(!is.na(d))) * match(!is.na(d), TRUE)

给出:

     x  y    z x_id y_id z_id
1    A AA  AAA    1    4    8
2    B BB <NA>    2    5   NA
3    C CC <NA>    3    6   NA
4 <NA> DD <NA>   NA    7   NA

这是 replace 的一个选项 - 创建一个 'd' 的逻辑矩阵,其中有 non-NA 个元素(!is.na(d)),replace 这些元素, 序列 (sum(!is.na(d)) - returns non-NA, seq_len 的总计数, 给出该计数的序列) 并将其分配 (<-) 给新的通过 pasteing 现有列名称上的 '_id' 列

d[paste0(names(d), "_id")] <- replace(d, !is.na(d), seq_len(sum(!is.na(d))))

-输出

> d
     x  y    z x_id y_id z_id
1    A AA  AAA    1    4    8
2    B BB <NA>    2    5 <NA>
3    C CC <NA>    3    6 <NA>
4 <NA> DD <NA> <NA>    7 <NA>