有条件求和R |如何按条件规则对行求和

时间:2018-10-16 00:24:03

标签: r

我希望将水平包含4个变量的一行求和成为1列。另外,在某些数据中也有NA值,我正在尝试执行以下操作:

(如果有NA)

(sum the row have values) * 4/(4 - number of NAs)

Example    [1]   [2]   [3]   [4]  [Row sum]
            2     3     1     5    => sum = 11
            5     2     3     NA   => sum = 10 + (4/4-1)
            .     .     .     .    =>
            .     .     .     .    =>
            .     .     .     .    =>
           etc   etc   etc   etc

我正在寻找一种可以将这些行加到一个函数中的函数,并且想知道如何实现。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您还可以使用tidyverse方法:

require(tidyverse)
#Sample data
set.seed(123) 
df <- data.frame(v1 = sample(c(1:10, NA), 10),
                 v2 = sample(c(1:10, NA), 10),
                 v3 = sample(c(1:10, NA), 10),
                 v4 = sample(c(1:10, NA), 10))

df %>% 
  mutate(mySum = rowSums(data.frame(v1, v2, v3, v4), na.rm = TRUE) * 
           (4 / (4 - rowSums(is.na(data.frame(v1, v2, v3, v4))))))

输出:

   v1 v2 v3 v4    mySum
1   4 NA 10 NA 28.00000
2   8  5  7 10 30.00000
3  NA  7  6  7 26.66667
4  10 10  8  9 37.00000
5   7  1  5  1 14.00000
6   1  6 NA  3 13.33333
7   3  2  3  4 12.00000
8   9  9  9  8 35.00000
9   2  4  1  5 12.00000
10  6  8  4  6 24.00000

答案 1 :(得分:0)

这是执行此操作的一种方法-

row_sums <- function(df) {
  rowSums(df, na.rm = T) + is.na(rowSums(df))*ncol(df)/(ncol(df) - rowSums(is.na(df)))
}

df <- data.frame(v1 = c(2,5), v2 = c(3,2), v3 = c(1,3), v4 = c(5,NA))

df$v5 <- row_sums(df)
df

# v1 v2 v3 v4       v5
# 1  2  3  1  5 11.00000
# 2  5  2  3 NA 11.33333