簡體   English   中英

如何根據 R 中的最小值和列值創建新字段

[英]How to create new fields based on min vals and column values in R

我有一個看起來像這樣的數據框:

ID | One   |  Two   | Three

A    0.6      0.4     0.2
B    0.2      0.32    0.12
C    0.1      0.24    0.14
D    0.62     0.12    0.19

我想要做的是根據每個 ID 的平均值、每個 ID 的最小值創建三個新字段,然后是調用與該最小值關聯的關聯列標題(名稱)的最后一列。

輸出將如下所示:

ID | One   |  Two   | Three  | Avg  |  Min   | Min Header

A    0.6      0.4     0.2      0.4    0.2     Three
B    0.2      0.32    0.12     0.21   0.12    Three
C    0.1      0.24    0.14     0.16   0.1     One
D    0.62     0.12    0.19     0.31   0.12    Two

我目前正在使用 group_by(ID) %>% summarise(avg = col1+col2+col3/3, min = pmin(col1,col2,col3) 來創建新的數據幀,但不知道如何將列標題作為新的列在我的 group_by '%>%' 方法中。

任何幫助將不勝感激!

這是dplyr一個選項,在將數值更改為負數后,我們根據每行的max.col索引獲得“MinHeader”,然后我們使用rowMeanspmin來獲得每行的meanmin

library(dplyr)
library(purrr)
df1 %>%
  mutate(MinHeader = names(.)[-1][max.col(-.[-1])], 
          Avg = rowMeans(.[2:4], na.rm = TRUE), 
          Min = invoke(pmin, .[2:4])) 

-輸出

# ID  One  Two Three MinHeader       Avg  Min
#1  A 0.60 0.40  0.20     Three 0.4000000 0.20
#2  B 0.20 0.32  0.12     Three 0.2133333 0.12
#3  C 0.10 0.24  0.14       One 0.1600000 0.10
#4  D 0.62 0.12  0.19       Two 0.3100000 0.12

數據

df1 <- structure(list(ID = c("A", "B", "C", "D"), One = c(0.6, 0.2, 
0.1, 0.62), Two = c(0.4, 0.32, 0.24, 0.12), Three = c(0.2, 0.12, 
0.14, 0.19)), class = "data.frame", row.names = c(NA, -4L))

如果您使用的是dplyr 1.0.0 或更高版本,則可以將rowwisec_across rowwise使用:

library(dplyr)

df %>%
  rowwise() %>%
  mutate(Avg = mean(c_across(One:Three), na.rm = TRUE), 
         Min = min(c_across(One:Three), na.rm = TRUE), 
         Min_header = names(.)[-1][which.min(c_across(One:Three))])

#  ID      One   Two Three   Avg   Min Min_header
#  <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>     
#1 A      0.6   0.4   0.2  0.4    0.2  Three     
#2 B      0.2   0.32  0.12 0.213  0.12 Three     
#3 C      0.1   0.24  0.14 0.16   0.1  One       
#4 D      0.62  0.12  0.19 0.31   0.12 Two       

這是另一種dplyr方法

library(dplyr)
df %>%
  mutate(
    mat = as.matrix(across(One:Three)), # create a temporary matrix that only contains columns One to Three
    mincol = max.col(-mat),
    Avg = rowMeans(mat, na.rm = TRUE), 
    Min = mat[cbind(1:n(), mincol)],
    MinHeader = colnames(mat)[mincol],
    mat = NULL, mincol = NULL
  )

輸出

  ID  One  Two Three       Avg  Min MinHeader
1  A 0.60 0.40  0.20 0.4000000 0.20     Three
2  B 0.20 0.32  0.12 0.2133333 0.12     Three
3  C 0.10 0.24  0.14 0.1600000 0.10       One
4  D 0.62 0.12  0.19 0.3100000 0.12       Two

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM