pmax (pmin) na.rm 不起作用 - NA/NaN 参数存在问题

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

我正在处理与

pmax
(和
pmin
)函数相关的问题。我知道它用于获取行最大(最小值)值。我想要得到的是最大值和最小值,以便将一些列设置为一个新的范围,以平衡我的分析。 a:g 是旧范围,e:g 是我想要使用和平衡的新范围。我的数据框并不完全相同(实际上相当大),但为了开门见山,我们可以说 df 是这样的:

# Example df

ind <- c("A","B","C")
y <- c(2008,2012,2016,2020)
indiv <- rep(ind, times=4)
year <- rep(y, times=3)

a <- runif(n=12, min=0, max=100)
b <- runif(n=12, min=0, max=100)
c <- runif(n=12, min=0, max=100)
d <- runif(n=12, min=0, max=100)
e <- runif(n=12, min=0, max=100)
f <- runif(n=12, min=0, max=100)
g <- runif(n=12, min=0, max=100)

df_data <- data.frame(indiv,year,a,b,c,d,e,f,g)

# Code for max min and new range

newdf <- df_data %>% 
  mutate(Oldmax = pmax(a:g,na.rm=TRUE)) %>% 
  mutate(Oldmin = pmin(a:g,na.rm=TRUE)) %>% 
  mutate(Newmax = pmax(e:g,na.rm=TRUE)) %>% 
  mutate(Newmin = pmin(e:g,na.rm=TRUE)) %>% 
  mutate(Oldrange = Oldmax-Oldmin) %>% 
  mutate(Newrange = Newmax-Newmin) %>% 
  mutate(across(e:g,
                (((~ .x - Oldmin) * Newrange) / Oldrange) + Newmin,
                .names = "{.col}_bal")
         )

控制台告诉我参数为 NA 有问题,我将 na.rm 设置为 TRUE,但仍然遇到问题。任何有关 pmax 和 rowwise 函数的进一步建议将不胜感激。预先感谢。

r dplyr
1个回答
0
投票

首先感谢@Iroha 的巨大帮助。问题是,将非整洁函数与其他整洁函数一起使用时存在兼容性和支持问题,这让我非常困惑(ik,菜鸟错误:p)。

因此,要解决这个问题。您必须使用

do.call()
调用该函数并使用
pick()
调用该列。修复后的代码如下:

# Example df

ind <- c("A","B","C")
y <- c(2008,2012,2016,2020)
indiv <- rep(ind, times=4)
year <- rep(y, times=3)

a <- runif(n=12, min=0, max=100)
b <- runif(n=12, min=0, max=100)
c <- runif(n=12, min=0, max=100)
d <- runif(n=12, min=0, max=100)
e <- runif(n=12, min=0, max=100)
f <- runif(n=12, min=0, max=100)
g <- runif(n=12, min=0, max=100)

df_data <- data.frame(indiv,year,a,b,c,d,e,f,g)

# Code for max min and new range

newdf <- df_data %>% 
  mutate(Oldmax = do.call(pmax,c(pick(a:g),na.rm=TRUE)),
         Oldmin = do.call(pmin,c(pick(a:g),na.rm=TRUE)),
         Newmax = do.call(pmax,c(pick(e:g),na.rm=TRUE)),
         Newmin = do.call(pmin,c(pick(e:g),na.rm=TRUE)),
         Oldrange = Oldmax-Oldmin,
         Newrange = Newmax-Newmin) %>% 
  mutate(across(e:g,
                (((~ .x - Oldmin) * Newrange) / Oldrange) + Newmin,
                .names = "{.col}_bal")
         )

虽然不需要跨域应用,但支持。如果您不知道它是如何工作的,请检查有关

do.call()
功能 的信息,即使您一直不记得它(就像我的情况一样),它也可能非常有用。

希望任何处理此类问题的人都能发现它很有用:)

© www.soinside.com 2019 - 2024. All rights reserved.