基于另一列的最后一个值从一列返回值

问题描述 投票:1回答:1

我有一个像这样的数据集:

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中的值,该值对应于ABC中的最后一个数值。例如,ABC的最后一个数值分别是12、13和32。

因此,对应的Time值为65、25和4。

我已经尝试过类似data[which(data$Time== max(data$A)), ]的操作,但这不起作用。

r dataframe max rows data-cleaning
1个回答
1
投票

我们可以将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
© www.soinside.com 2019 - 2024. All rights reserved.