簡體   English   中英

R:如何使用dplyr計算缺少值的每行的平均值

[英]R: How to calculate mean for each row with missing values using dplyr

我想計算包含缺失值的數據框中每行的多個列的均值,並將結果放在一個名為“means”的新列中。 這是我的數據幀:

df <- data.frame(A=c(3,4,5),B=c(0,6,8),C=c(9,NA,1))
  A B  C
1 3 0  9
2 4 6 NA
3 5 8  1

如果列沒有缺失值,則下面的代碼可以成功完成任務,例如A列和B列。

 library(dplyr)
 df %>%
 rowwise() %>%
 mutate(means=mean(A:B, na.rm=T))

     A     B     C   means
  <dbl> <dbl> <dbl> <dbl>
1     3     0     9   1.5
2     4     6    NA   5.0
3     5     8     1   6.5

但是,如果列缺少值,例如C,則會出現錯誤:

> df %>% rowwise() %>% mutate(means=mean(A:C, na.rm=T))
Error: NA/NaN argument

理想情況下,我想用dplyr實現它。

df %>% 
  mutate(means=rowMeans(., na.rm=TRUE))

. 是一個“代詞”,它引用了管道mutate的數據幀df

  ABC means 1 3 0 9 4.000000 2 4 6 NA 5.000000 3 5 8 1 4.666667 

您還可以使用所有常用方法(列名,索引, grep等)僅選擇要包括的特定列。

df %>% 
  mutate(means=rowMeans(.[ , c("A","C")], na.rm=TRUE))
  ABC means 1 3 0 9 6 2 4 6 NA 4 3 5 8 1 3 

在基數R中也很容易實現:

cbind(df, "means"=rowMeans(df, na.rm=TRUE))
  A B  C    means
1 3 0  9 4.000000
2 4 6 NA 5.000000
3 5 8  1 4.666667

rowMeans執行計算。並允許na.rm參數跳過缺失值,而cbind允許您將所需的平均值和任何名稱綁定到data.frame,df。

關於OP代碼中的錯誤,我們可以使用連接函數c將這些元素作為單個vector ,然后執行mean因為mean只能使用一個參數。

df %>%
    rowwise() %>% 
    mutate(means = mean(c(A, B, C), na.rm = TRUE))
#     A     B     C    means 
#  <dbl> <dbl> <dbl>    <dbl>
#1     3     0     9 4.000000
#2     4     6    NA 5.000000
#3     5     8     1 4.666667

此外,我們可以使用rowMeanstransform

transform(df, means = rowMeans(df, na.rm = TRUE))
#  A B  C    means
#1 3 0  9 4.000000
#2 4 6 NA 5.000000
#3 5 8  1 4.666667

或者使用data.table

library(data.table)
setDT(df)[, means := rowMeans(.SD, na.rm = TRUE)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM