根据另一列的最后一个值从一列返回值
Returning values from a column based on the last value of another column
我有一个这样的数据集:
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
)以子集 'Time' 列
library(matrixStats)
data$Time[colMaxs((!is.na(data[-1])) * row(data[-1]))]
#[1] 65 25 4
或者使用 base R
,我们用 which/arr.ind
得到索引,使用分组操作 (tapply
) 得到 max
索引,并用它来提取'Time'价值
m1 <- which(!is.na(data[-1]), arr.ind = TRUE)
data$Time[tapply(m1[,1], m1[,2], FUN = max)]
#[1] 65 25 4
或者在 dplyr
的开发版本中使用 summarise/across
library(dplyr)
data %>%
summarise(across(A:C, ~ tail(Time[!is.na(.)], 1)))
# A B C
#1 65 25 4
或将 summarise_at
与 dplyr
的当前版本一起使用
data %>%
summarise_at(vars(A:C), ~ tail(Time[!is.na(.)], 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
中对应于 A
、B
和 C
中最后一个数值的值。
例如,A
、B
、C
的最后数值分别为12、13、32。
因此,对应的 Time
值为 65、25 和 4。
我试过 data[which(data$Time== max(data$A)), ]
之类的方法,但这不起作用。
我们可以将 row
索引与逻辑 matrix
相乘,并得到 colMaxs
(来自 matrixStats
)以子集 'Time' 列
library(matrixStats)
data$Time[colMaxs((!is.na(data[-1])) * row(data[-1]))]
#[1] 65 25 4
或者使用 base R
,我们用 which/arr.ind
得到索引,使用分组操作 (tapply
) 得到 max
索引,并用它来提取'Time'价值
m1 <- which(!is.na(data[-1]), arr.ind = TRUE)
data$Time[tapply(m1[,1], m1[,2], FUN = max)]
#[1] 65 25 4
或者在 dplyr
summarise/across
library(dplyr)
data %>%
summarise(across(A:C, ~ tail(Time[!is.na(.)], 1)))
# A B C
#1 65 25 4
或将 summarise_at
与 dplyr
data %>%
summarise_at(vars(A:C), ~ tail(Time[!is.na(.)], 1))