gpt4 book ai didi

使用 dplyr 计算多列的行中位数

转载 作者:行者123 更新时间:2023-12-03 09:04:58 24 4
gpt4 key购买 nike

给定以下数据集,我想计算每行 M1、M2 和 M3 列的中值。我正在寻找一种解决方案,其中最后一列以“Median”名称添加到数据框中。不应直接使用列名称(M1:M3)(在原始数据集中,还有更多列,而不仅仅是 3 列)。

# A tibble: 8 x 5
I1 M1 M2 I2 M3
<int> <int> <int> <int> <int>
1 3 4 5 3 5
2 2 2 2 2 1
3 2 2 2 2 2
4 3 1 3 3 1
5 2 1 3 3 1
6 3 2 4 4 3
7 3 1 3 4 1
8 2 1 3 2 3

您可以使用以下方式加载数据集:

df = structure(list(I1 = c(3L, 2L, 2L, 3L, 2L, 3L, 3L, 2L), M1 = c(4L, 
2L, 2L, 1L, 1L, 2L, 1L, 1L), M2 = c(5L, 2L, 2L, 3L, 3L, 4L, 3L,
3L), I2 = c(3L, 2L, 2L, 3L, 3L, 4L, 4L, 2L), M3 = c(5L, 1L, 2L,
1L, 1L, 3L, 1L, 3L)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -8L), .Names = c("I1", "M1", "M2", "I2",
"M3"))

我知道已经有人提出了几个类似的问题。但是,发布的大多数解决方案都使用 rowMeansrowSums。我正在寻找一个解决方案:

  1. 不能使用“行函数”。
  2. 解决方案是一个简单的 dplyr 解决方案

(2)的原因是我正在向完全的初学者教授“tidyverse”。

最佳答案

我们可以使用rowMedians

library(matrixStats)
library(dplyr)
df %>%
mutate(Median = rowMedians(as.matrix(.[grep('M\\d+', names(.))])))

或者,如果我们只需要使用 tidyverse 函数,请使用 gathersummarize by row 将其转换为“长”格式 并获取“值”列的中位数

df %>% 
rownames_to_column('rn') %>%
gather(key, value, starts_with('M')) %>%
group_by(rn) %>%
summarise(Median = median(value)) %>%
ungroup %>%
select(-rn) %>%
bind_cols(df, .)

或者另一个选项是来自 dplyrrowwise() (希望行不是问题)

df %>% 
rowwise() %>%
mutate(Median = median(c(!!! rlang::syms(grep('M', names(.), value=TRUE)))))

关于使用 dplyr 计算多列的行中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47773350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com