R 如何在数据框中获取行的中位数

Nic*_*lli 6 r median

我想知道是否有任何方法可以计算数据框中行的中位数。我知道函数 rowmeans 存在,但我不相信有行中值函数。我想将结果存储在数据框中的新列中。这是我的例子

我试着在网上看。有一次提到行中位数,但我在 R 中找不到该函数。

 C1<-c(3,2,4,4,5)
   C2<-c(3,7,3,4,5)
   C3<-c(5,4,3,6,3)
   DF <- data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)

   DF 


  # This is as far as I have gotten, but not streamlined

  MA <- median(C(3, 3, 5). na.rm = T)   # A
  MB <- median(C(2, 7, 4). na.rm = T)   # B
  MC <- median(C(4, 3, 3). na.rm = T)   # C
  MD <- median(C(4, 4, 6). na.rm = T)   # 4
  ME <- median(C(5, 5, 3). na.rm = T)   # E

  CM <- c(MA, MB, MC, MD, ME)C1<-c(3,2,4,4,5)


   ID C1 C2 C3
  1  A  3  3  5
  2  B  2  7  4
  3  C  4  3  3
  4  D  4  4  6
  5  E  5  5  3

   ID C1 C2 C3  CM
  1  A  3  3  5
  2  B  2  7  4
  3  C  4  3  3
  4  D  4  4  6
  5  E  5  5  3
Run Code Online (Sandbox Code Playgroud)

无论如何我可以简化这个过程,所以它就像 DF$CM <-中值(...

小智 10

要计算 的中位数df,您可以执行以下操作

df$median = apply(df, 1, median, na.rm=T)
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您想使用,您可以在这里dplyr找到一个示例,尤其是mpalanco 的答案。简而言之,在使用指示操作应按行应用(而不是默认情况下应用于整个数据框)后,您可以使用计算并命名现有列的选择的新列。查看有关每个函数的文档以了解更多详细信息。rowwisemutate

例如,

library(dplyr)

DF %>% 
  rowwise() %>% 
  mutate(CM = median(c(C1, C2, C3), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)

将产生输出:

# A tibble: 5 x 5
  ID       C1    C2    C3    CM
  <fct> <dbl> <dbl> <dbl> <dbl>
1 A         3     3     5     3
2 B         2     7     4     4
3 C         4     3     3     3
4 D         4     4     6     4
5 E         5     5     3     5
Run Code Online (Sandbox Code Playgroud)


Ano*_*n R 6

只是更加灵活和更新一点。我们使用c_acrosswithrowwise函数,它允许使用tidy-select语义。这里我们选择where指定我们只希望数字列计算中位数。

library(dplyr)

DF %>%
  rowwise() %>%
  mutate(med = median(c_across(where(is.numeric)), na.rm = TRUE))

# A tibble: 5 x 5
# Rowwise: 
  ID       C1    C2    C3   med
  <chr> <dbl> <dbl> <dbl> <dbl>
1 A         3     3     5     3
2 B         2     7     4     4
3 C         4     3     3     3
4 D         4     4     6     4
5 E         5     5     3     5
Run Code Online (Sandbox Code Playgroud)