我有一个像这样的数据集:
data <- data.frame(Time = c(1,4,6,9,11,13,16, 25, 32, 65),
A = c(10, NA, 13, 2, 32, 19, 32, 34, 93, 12),
B = c(1, 99, 32, 31, 12, 13, NA, 13, NA, NA),
C = c(2, 32, NA, NA, NA, NA, NA, NA, NA, NA))
我要检索的是Time
中的值,该值对应于A
,B
和C
中的最后一个数值。例如,A
,B
和C
的最后一个数值分别是12、13和32。
因此,对应的Time
值为65、25和4。
我已经尝试过类似data[which(data$Time== max(data$A)), ]
的操作,但这不起作用。
我们可以将row
索引与逻辑matrix
相乘,并获得colMaxs
(来自matrixStats
),以对“时间”列进行子集化]
library(matrixStats)
data$Time[colMaxs((!is.na(data[-1])) * row(data[-1]))]
#[1] 65 25 4
或使用base R
,我们用which/arr.ind
得到索引,使用按运算符分组的max
索引(tapply
),并用它来提取“时间”值
m1 <- which(!is.na(data[-1]), arr.ind = TRUE)
data$Time[tapply(m1[,1], m1[,2], FUN = max)]
#[1] 65 25 4
或带有summarise/across
library(dplyr)
data %>%
summarise(across(A:C, ~ tail(Time[!is.na(.)], 1)))
# A B C
#1 65 25 4