如何从Mutate Max操作中排除单个列,但保留 Dataframe 中所有列

7y4bm7vi  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(137)

我尝试同时获取行之间的总和和行中的最大值。我显然不希望行总和列包含在最大值中,也不希望行总和包含最大值。但是,我需要一个同时保留这两列的最终数据集。
我试着用dplyr-

iris<- iris %>%
 mutate(readsum = rowSums(across(where(is.numeric)), na.rm=TRUE))

iris_max<- iris %>%
   rowwise()%>%
    select(-"readsum")%>%
  mutate(readmax = max(across(where(is.numeric)), na.rm=TRUE))

但这只是从新的DF中删除了readsum
我希望得到以下输出:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species readsum readmax
         <dbl>       <dbl>        <dbl>       <dbl> <fct>     <dbl>   <dbl>
1          5.1         3.5          1.4         0.2 setosa     10.2    5.1
2          4.9         3            1.4         0.2 setosa      9.5    4.9
3          4.7         3.2          1.3         0.2 setosa      9.4    4.7
4          4.6         3.1          1.5         0.2 setosa      9.4    4.6
5          5           3.6          1.4         0.2 setosa     10.2    5
6          5.4         3.9          1.7         0.4 setosa     11.4    5.4
hfyxw5xn

hfyxw5xn1#

使用c_across并将where环绕is.numeric
在最终结果中保留新列readsum的一种方法是,首先为已经是数值的列创建一个索引,然后创建readsum

suppressPackageStartupMessages(
  library(dplyr)
)

data(iris, package = "datasets")

i_num <- iris %>% 
  sapply(is.numeric) %>% 
  which()

iris <- iris %>%
  mutate(readsum = rowSums(across(where(is.numeric)), na.rm=TRUE))

head(iris)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species readsum
#> 1          5.1         3.5          1.4         0.2  setosa    10.2
#> 2          4.9         3.0          1.4         0.2  setosa     9.5
#> 3          4.7         3.2          1.3         0.2  setosa     9.4
#> 4          4.6         3.1          1.5         0.2  setosa     9.4
#> 5          5.0         3.6          1.4         0.2  setosa    10.2
#> 6          5.4         3.9          1.7         0.4  setosa    11.4

iris %>%
  rowwise() %>%
  mutate(readmax = max(c_across(all_of(i_num))))
#> # A tibble: 150 × 7
#> # Rowwise: 
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species readsum readmax
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>     <dbl>   <dbl>
#>  1          5.1         3.5          1.4         0.2 setosa     10.2     5.1
#>  2          4.9         3            1.4         0.2 setosa      9.5     4.9
#>  3          4.7         3.2          1.3         0.2 setosa      9.4     4.7
#>  4          4.6         3.1          1.5         0.2 setosa      9.4     4.6
#>  5          5           3.6          1.4         0.2 setosa     10.2     5  
#>  6          5.4         3.9          1.7         0.4 setosa     11.4     5.4
#>  7          4.6         3.4          1.4         0.3 setosa      9.7     4.6
#>  8          5           3.4          1.5         0.2 setosa     10.1     5  
#>  9          4.4         2.9          1.4         0.2 setosa      8.9     4.4
#> 10          4.9         3.1          1.5         0.1 setosa      9.6     4.9
#> # … with 140 more rows

创建于2022年12月19日,使用reprex v2.0.2

ioekq8ef

ioekq8ef2#

下面是使用purrrpmax中的reduce的另一种方法,使用select仅包含原始 Dataframe 中的列:

library(tidyverse)

iris %>%
  mutate(readsum = rowSums(across(where(is.numeric)), na.rm = T),
         readmax = select(., where(is.numeric)) %>% reduce(pmax, na.rm = T))
    • 产出**
Sepal.Length Sepal.Width Petal.Length Petal.Width    Species readsum readmax
1            5.1         3.5          1.4         0.2     setosa    10.2     5.1
2            4.9         3.0          1.4         0.2     setosa     9.5     4.9
3            4.7         3.2          1.3         0.2     setosa     9.4     4.7
4            4.6         3.1          1.5         0.2     setosa     9.4     4.6
5            5.0         3.6          1.4         0.2     setosa    10.2     5.0
6            5.4         3.9          1.7         0.4     setosa    11.4     5.4
7            4.6         3.4          1.4         0.3     setosa     9.7     4.6
8            5.0         3.4          1.5         0.2     setosa    10.1     5.0
...

相关问题