在数据框中创建 "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>
- 我想为这个 table 中的每个元素指定“升序 ID”,这样 NA 就不会被分配 ID - 例如:
在上面的例子中:
Column X的第一行赋值为id = 1,Column X的第二行赋值为id = 2,Column X的第三行赋值为id = 3,以及第 X 列的第四行被跳过,因为有一个 NA
由于Y列中没有NA,所以Y列的第一行被指定为id = 4(从上一行中取出),Y列的第二行被指定为id = 5,Column Y的第三行赋值为id = 6,Column 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' 的逻辑矩阵,其中有 non-NA 个元素(!is.na(d)
),replace
这些元素, 序列 (sum(!is.na(d))
- returns non-NA, seq_len
的总计数, 给出该计数的序列) 并将其分配 (<-
) 给新的通过 paste
ing 现有列名称上的 '_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>
我在 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>
- 我想为这个 table 中的每个元素指定“升序 ID”,这样 NA 就不会被分配 ID - 例如:
在上面的例子中:
Column X的第一行赋值为id = 1,Column X的第二行赋值为id = 2,Column X的第三行赋值为id = 3,以及第 X 列的第四行被跳过,因为有一个 NA
由于Y列中没有NA,所以Y列的第一行被指定为id = 4(从上一行中取出),Y列的第二行被指定为id = 5,Column Y的第三行赋值为id = 6,Column 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' 的逻辑矩阵,其中有 non-NA 个元素(!is.na(d)
),replace
这些元素, 序列 (sum(!is.na(d))
- returns non-NA, seq_len
的总计数, 给出该计数的序列) 并将其分配 (<-
) 给新的通过 paste
ing 现有列名称上的 '_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>