如何根据 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 的最小值创建三个新字段,然后是调用关联列 header(名称)关联到的最后一列最小值。
输出将如下所示:
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) 创建新的数据框,但 idk如何在我的 group_by '%>%' 方法中将列 header 拉为新列。
如有任何帮助,我们将不胜感激!
这是一个带有 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
一起使用:
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
我有一个如下所示的数据框:
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 的最小值创建三个新字段,然后是调用关联列 header(名称)关联到的最后一列最小值。
输出将如下所示:
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) 创建新的数据框,但 idk如何在我的 group_by '%>%' 方法中将列 header 拉为新列。
如有任何帮助,我们将不胜感激!
这是一个带有 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
一起使用:
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