![](/img/trans.png)
[英]How to create a new column with multiple values based on another column in 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”,然后我們使用rowMeans
和pmin
來獲得每行的mean
和min
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 或更高版本,則可以將rowwise
與c_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.