从多个列中选择最高值,其中许多列是R中的NA


ID diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4 diagnosis_5 diagnosis_6 diagnosis_7 diagnosis_8 diagnosis_9 diagnosis_10 diagnosis_11 diagnosis_12 diagnosis_13 age
1  123           1           3          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  54
2 5345           2           3           1          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  65
3  234           3          NA          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  23
4  453           4           1          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  22
5 3656           5          NA          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  33
6  345           1           4           3           1          NA          NA          NA          NA          NA           NA           NA           NA           NA  77

我想创建另一列;诊断";每行选择列。理想情况下使用基本R

期望的结果将是一个额外的列c

你可以试试这个:

#Names
nvec <- which(grepl('diagnosis',names(df)))
#Var
df$c <- apply(df[,nvec],1,max,na.rm=T)
ID diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4 diagnosis_5 diagnosis_6 diagnosis_7 diagnosis_8
1  123           1           3          NA          NA          NA          NA          NA          NA
2 5345           2           3           1          NA          NA          NA          NA          NA
3  234           3          NA          NA          NA          NA          NA          NA          NA
4  453           4           1          NA          NA          NA          NA          NA          NA
5 3656           5          NA          NA          NA          NA          NA          NA          NA
6  345           1           4           3           1          NA          NA          NA          NA
diagnosis_9 diagnosis_10 diagnosis_11 diagnosis_12 diagnosis_13 age c
1          NA           NA           NA           NA           NA  54 3
2          NA           NA           NA           NA           NA  65 3
3          NA           NA           NA           NA           NA  23 3
4          NA           NA           NA           NA           NA  22 4
5          NA           NA           NA           NA           NA  33 5
6          NA           NA           NA           NA           NA  77 4
#Data
df <- structure(list(ID = c(123L, 5345L, 234L, 453L, 3656L, 345L), 
diagnosis_1 = c(1L, 2L, 3L, 4L, 5L, 1L), diagnosis_2 = c(3L, 
3L, NA, 1L, NA, 4L), diagnosis_3 = c(NA, 1L, NA, NA, NA, 
3L), diagnosis_4 = c(NA, NA, NA, NA, NA, 1L), diagnosis_5 = c(NA, 
NA, NA, NA, NA, NA), diagnosis_6 = c(NA, NA, NA, NA, NA, 
NA), diagnosis_7 = c(NA, NA, NA, NA, NA, NA), diagnosis_8 = c(NA, 
NA, NA, NA, NA, NA), diagnosis_9 = c(NA, NA, NA, NA, NA, 
NA), diagnosis_10 = c(NA, NA, NA, NA, NA, NA), diagnosis_11 = c(NA, 
NA, NA, NA, NA, NA), diagnosis_12 = c(NA, NA, NA, NA, NA, 
NA), diagnosis_13 = c(NA, NA, NA, NA, NA, NA), age = c(54L, 
65L, 23L, 22L, 33L, 77L)), row.names = c(NA, -6L), class = "data.frame")

您可以将pmaxdo.call一起使用(您需要以列表形式提供参数(:

df$c <- do.call(pmax, c(df[ ,c(-1,-ncol(df))], na.rm = TRUE))

输出

> do.call(pmax, c(df[ ,c(-1,-ncol(df))], na.rm = TRUE))
[1] 3 3 3 4 5 4

您可以在指定了na.rm = TRUEdo.call()的数据帧上使用pmax()。对于大型数据帧来说,这应该可以很好地扩展。希望它能有所帮助!!

do.call(pmax, c(df[startsWith(names(df), "diagnosis")], na.rm = TRUE))
[1] 3 3 3 4 5 4

或者,如果它更容易阅读,你可以创建一个包装器:

pmax_na_true <- function(...) pmax(..., na.rm = TRUE)
do.call(pmax_na_true, df[startsWith(names(df), "diagnosis")])
[1] 3 3 3 4 5 4

数据:

df <- read.table(header = TRUE, text = " ID diagnosis_1 diagnosis_2 diagnosis_3 diagnosis_4 diagnosis_5 diagnosis_6 diagnosis_7 diagnosis_8 diagnosis_9 diagnosis_10 diagnosis_11 diagnosis_12 diagnosis_13 age
1  123           1           3          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  54
2 5345           2           3           1          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  65
3  234           3          NA          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  23
4  453           4           1          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  22
5 3656           5          NA          NA          NA          NA          NA          NA          NA          NA           NA           NA           NA           NA  33
6  345           1           4           3           1          NA          NA          NA          NA          NA           NA           NA           NA           NA  77")

最新更新