[英]Using purrr rowwise instead of apply() on whole row
我想用purrr
函数替换apply()
(和它的衍生物)。
我有一个像这样的data.frame:
> df
V1 V2 V3
1 NA 2 3
2 2 NA 3
3 3 3 NA
我想逐行应用两个函数: min(x, na.rm = T)
和which.min(x)
并将结果作为数据帧返回。
如果我知道我可以做多少列,例如:
pmap_dfr(df, function(V1, V2, V3) {data.frame(min = pmin(V1, V2, V3, na.rm = T),
where = which.min(c(V1, V2, V3)))})
min where
1 2 2
2 2 1
3 3 1
我怎样才能使pmap()
或任何其他purrr
函数将整行作为参数,就像apply()
一样?
func <- function(x) {data.frame(min = min(x, na.rm = T), where = which.min(x))}
> Reduce(rbind, apply(df,1, func))
min where
V2 2 2
V1 2 1
V11 3 1
我可能只是错过了一个功能或一些技巧。 谢谢你的帮助。
如果使用省略号,则您的解决方案适用于所有列。
pmap_dfr(df, ~data.frame(min = min(..., na.rm = TRUE), where = which.min(c(...))))
min where
1 2 2
2 2 1
3 3 1
一种可能性是:
df %>%
mutate(min = invoke(pmin, na.rm = TRUE, .),
where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))
V1 V2 V3 min where
1 NA 2 3 2 2
2 2 NA 3 2 1
3 3 3 NA 3 1
或者,如果您想保留最后两列:
df %>%
transmute(min = invoke(pmin, na.rm = TRUE, .),
where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))
不是purrr
-solution,而是data.table
oneliner。
library(data.table)
dt <- fread("row V1 V2 V3
1 NA 2 3
2 2 NA 3
3 3 3 NA")
melt(dt, id.vars = "row")[ , .SD[which.min(value)], by = row]
row variable value 1: 1 V2 2 2: 2 V1 2 3: 3 V1 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.