gpt4 book ai didi

r - 使用 dplyr 在 data.frame 中查找逐行最小正非零数

转载 作者:行者123 更新时间:2023-12-04 14:22:35 27 4
gpt4 key购买 nike

给定一个数字数据框

A <- c(1.1, 3.0, 2.0, 4.0, 0.0, 1.3)
B <- c(0.2, 1.0, 2.4, 1.1, 1.3, 0.0)
C <- c(5.2, 1.3, 3.7, 1.7, 1.3, 1.0)

data <- data.frame(A, B, C) %>% as_tibble()

如何创建另一个包含按行最小正非零数的列(如果可能,使用 dplyr)以获得以下数据框?

## A tibble: 6 x 4
# A B C posmin
# <dbl> <dbl> <dbl> <dbl>
#1 1.1 0.2 5.2 0.2
#2 3 1 1.3 1
#3 2 0 3.7 2
#4 4 1.1 1.7 1.1
#5 0 1.3 1.3 1.3
#6 1.3 0 1 1

简明扼要的是

data %>% mutate(posmin = pmin(A, B, C))

然而,这有两个问题:

  • 我的真实数据框有更多列(A 到 Z),我无法调用 pmin(A:Z)
  • pmin 计算行最小值

是否有类似 pminpos 的东西?如果没有,我该如何创建它以便像上面代码中的 pmin 一样调用它?我如何在不传递以逗号分隔的名称列表的情况下指定许多连续的列?

非常感谢。

编辑:我显然没有强调这一点,我正在寻找非零正数,即严格大于 > 0 的数字。因此,寻求-行 #5 和 #6 的值不为零。

最佳答案

一种选择是将列名转换为符号,然后计算 (!!!)

library(dplyr)
data %>%
mutate_all(funs(replace(., .==0, NA))) %>%
transmute(posmin = pmin(!!! rlang::syms(names(.)), na.rm = TRUE)) %>%
bind_cols(data, .)

# A tibble: 6 x 4
# A B C posmin
# <dbl> <dbl> <dbl> <dbl>
#1 1.1 0.2 5.2 0.2
#2 3 1 1.3 1
#3 2 2.4 3.7 2
#4 4 1.1 1.7 1.1
#5 0 1.3 1.3 1.3
#6 1.3 0 1 1

或者使用map/reduce

map(data, na_if, 0) %>% 
reduce(pmin, na.rm = TRUE) %>%
bind_cols(data, posmin = .)

或者不使用任何外部包,我们可以在 do.call 中调用 pmin 一行

data$posmin <- do.call(pmin, c(NA^ (data == 0) * data, na.rm = TRUE))
data$posmin
#[1] 0.2 1.0 2.0 1.1 1.3 1.0

或者根据@Moody_Mudskipper 的评论,不是将 0 赋值给 NA,而是将其更改为更大的值 (Inf),然后使用 pmin

data$posmin <- do.call(pmin, '[<-'(data, data <=0, value=Inf))

关于r - 使用 dplyr 在 data.frame 中查找逐行最小正非零数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52469836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com