如何解决如何基于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)创建新的数据帧,但idk如何将列标题提取为我的group_by'%>%'方法中的一个新列。
非常感谢任何帮助!
解决方法
这里是dplyr
的一个选项,在将数字值更改为负数后,我们基于每一行的max.col
索引获取'MinHeader',然后使用rowMeans
和{ {1}}以获取每行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
,
如果您使用的是dplyr
1.0.0或更高版本,则可以将rowwise
与c_across
结合使用:
library(dplyr)
df %>%
rowwise() %>%
mutate(Avg = mean(c_across(One:Three),Min = min(c_across(One:Three),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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。