我有一个由因子列组成的data.table,我想提取每一行中最后一个非缺失值所对应的标签。这有点类似于典型的max.col
情况,但我不想无谓地进行强制转换,因为我正尝试使用data.table来优化此代码。真实数据还包括其他类型的列。
以下是示例:
## Some sample data
set.seed(0)
dat <- sapply(split(letters[1:25], rep.int(1:5, 5)), sample, size=8, replace=TRUE)
dat[upper.tri(dat)] <- NA
dat[4:5, 4:5] <- NA # the real data isnt nice and upper.triangular
dat <- data.frame(dat, stringsAsFactors = TRUE) # factor columns
## So, it looks like this
setDT(dat)[]
# X1 X2 X3 X4 X5
# 1: u NA NA NA NA
# 2: f q NA NA NA
# 3: f b w NA NA
# 4: k g h NA NA
# 5: u b r NA NA
# 6: f q w x t
# 7: u g h i e
# 8: u q r n t
## I just want to get the labels of the factors
## that are 'rightmost' in each row. I tried a number of things
## that probably don't make sense here.
## This just about gets the column index
dat[, colInd := sum(!is.na(.SD)), by=1:nrow(dat)]
这是目标,使用常规基本函数提取这些标签。
## Using max.col and a data.frame
df1 <- as.data.frame(dat)
inds <- max.col(is.na(as.matrix(df1)), ties="first")-1
inds[inds==0] <- ncol(df1)
df1[cbind(1:nrow(df1), inds)]
# [1] "u" "q" "w" "h" "r" "t" "e" "t"
as.list.data.table
。 - alexis_lazas.list
解决了,是的。 - Frankfor(i in length(x):1)
可能可以避免对“x”进行迭代子集操作,但使用递归更新非NA
索引会更加简洁。@Frank:我也尝试过x[, -length(x), with = FALSE]
,但仍然在函数中遇到了一些问题。 - alexis_lazset
,速度有些更快。 - Frank