我希望将水平包含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
我正在寻找一种可以将这些行加到一个函数中的函数,并且想知道如何实现。
提前谢谢!
答案 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