我想计算包含缺失值的数据框中每一行的多个列的均值,并将结果放在一个名为“均值”的新列中。这是我的数据框:
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实现它。
答案 0 :(得分:5)
df %>%
mutate(means=rowMeans(., na.rm=TRUE))
.
是一个“代词”,它引用了通过df
传送的数据框mutate
。
A B C 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))
A B C means 1 3 0 9 6 2 4 6 NA 4 3 5 8 1 3
答案 1 :(得分:3)
在基地R中也很容易完成:
knife vault update
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
执行计算。并允许na.rm参数跳过缺失值,而rowMeans
允许您将所需的平均值和名称绑定到data.frame, DF。
答案 2 :(得分:1)
关于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
此外,我们可以将rowMeans
与transform
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)]