在比较R中的最大值的两列时如何排除值
我有两列:A和B,每列的值从1到7。我需要得到两列之间的最大值,不包括值7,我如何才能做到这一点?或者,如果A有7,则我保留B的值,这将为我提供更多服务,例如:在比较R中的最大值的两列时如何排除值,r,max,R,Max,我有两列:A和B,每列的值从1到7。我需要得到两列之间的最大值,不包括值7,我如何才能做到这一点?或者,如果A有7,则我保留B的值,这将为我提供更多服务,例如: A <- c(1,1,1,3,2,4,2,5,6,7) B <- c(7,3,6,7,4,1,6,7,3,4) df <- data.frame(A, B) Expected results: 1,3,6,3,4,4,6,5,6,4 A一个选项可以是: with(df, pmax(A * (A != 7), B
A <- c(1,1,1,3,2,4,2,5,6,7)
B <- c(7,3,6,7,4,1,6,7,3,4)
df <- data.frame(A, B)
Expected results: 1,3,6,3,4,4,6,5,6,4
A一个选项可以是:
with(df, pmax(A * (A != 7), B * (B != 7)))
[1] 1 3 6 3 4 4 6 5 6 4
要处理缺少的值,请执行以下操作:
with(df, pmax(A * (A != 7), B * (B != 7), na.rm = TRUE))
还考虑到负值:
with(df, pmax(A * (A != 7)^NA, B * (B != 7)^NA, na.rm = TRUE))
更新特别感谢亲爱的@tmfmnk
也许有更好的方法来处理这个问题,但我突然想到用尽可能低的值(如0)替换每7个,这样就不会影响比较。它也适用于NA值
library(dplyr)
library(purrr)
A <- c(1,1,1,3,2,4,2,5,6,7)
B <- c(7,3,6,7,4,1,6,7,3,4)
df <- tibble(A, B)
df %>%
mutate(across(everything(), ~ replace(., . == 7, 0))) %>%
mutate(ResultColumn = pmap_dbl(., ~ max(c(...), na.rm = TRUE)))
# A tibble: 10 x 3
A B ResultColumn
<dbl> <dbl> <dbl>
1 1 0 1
2 1 3 3
3 1 6 6
4 3 0 3
5 2 4 4
6 4 1 4
7 2 6 6
8 5 0 5
9 6 3 6
10 0 4 4
库(dplyr)
图书馆(purrr)
Adf$max以下是tidyverse
示例:
library(tidyverse)
A <- c(1,1,1,3,2,4,2,5,6,7)
B <- c(7,3,6,7,4,1,6,7,3,4)
df <- data.frame(A,B)
df %>%
filter(A != 7, B != 7) %>%
transform(ResultColumn = pmax(A,B))
库(tidyverse)
使用pmax的另一个基本R选项
> do.call(pmax, c(replace(df, df == 7, NA), na.rm = TRUE))
[1] 1 3 6 3 4 4 6 5 6 4
或
我忘记了一件重要的事情,那就是我在一列中有带NA的值,而在另一列中我有一个3,例如,我需要保留3而不是NA。@tmfmnk谢谢你的注释,我使用它是因为str_replace
只接受字符串。但由于replace
这是可能的,所以您是对的。我编辑了我的代码。@AgustínDamiani我编辑了我的代码,以便它将NA
s排除在外。我忘记了一件重要的事情,我在一列中有带NA的值,在另一列中有一个3,例如,我需要保留3,而不是NApmax()
有一个参数来处理缺失的值。看看更新后的帖子。它很有效,伙计!谢谢:)您不应该从比较中排除任何行。只要任何一行中有一个7,另一个值就会被自动选择。哦,我明白了,如果他们想做一些函数,我的代码就没有帮助了。我应该写一个通用的代码——但它已经由某人给出了,所以你可以编辑你的代码,不管是否已经有答案。因为每个答案都有它自己的价值。
> do.call(pmax, c(replace(df, df == 7, NA), na.rm = TRUE))
[1] 1 3 6 3 4 4 6 5 6 4
> do.call(pmax, replace(df, df == 7, -Inf))
[1] 1 3 6 3 4 4 6 5 6 4