У меня есть эти данные в 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>
В приведенном выше примере:
Первая строка столбца X назначается как id = 1, вторая строка столбца X назначается как id = 2, третья строка столбца X назначается как id = 3, а четвертая строка столбца X пропускается, потому что является АН
Поскольку в столбце Y нет NA, первой строке столбца Y присваивается id = 4 (начиная с предыдущей строки), второй строке столбца Y присваивается id = 5, третьей строке столбца Y присваивается значение id = 5. назначается как id = 6, а четвертая строка столбца Y назначается как id = 7
Поскольку все строки в столбце Z являются NA, кроме первой строки, только первой строке столбца Z присваивается id = 8, а все остальные строки пропускаются.
Ты можешь попробовать:
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', где есть элементы, не относящиеся к NA (!is.na(d)
), replace
эти элементы, с последовательностью (sum(!is.na(d))
- возвращает общее количество не-NA, seq_len
, дает последовательность для которые учитываются) и назначьте (<-
) его новым столбцам, paste
введя «_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>