忽略向量和中的 NA

Ignore NA in vector sum

我想知道当我尝试对数据框中的某些列求和时是否有办法处理 NA 值?

这是我正在使用的数据的模拟示例:

id<-rep(1:4,each=8)
v1<-c(1,2,5,4,58,6,4,9)
v2<-c(78,85,56,47,12,3,65,98)
v3<-c(101,NA,452,NA,NA,45,7,56)
data<-data.frame(id,v1,v2,v3)
data
  id v1 v2  v3
1  1  1 78 101
2  1  2 85  NA
3  2  5 56 452
4  2  4 47  NA
5  3 58 12  NA
6  3  6  3  45
7  4  4 65   7
8  4  9 98  56

我想使用 v1、v2、v3 应用此公式:

data$cat<-v1*0.05+v2*0.05+v3*0.05

这是我使用总和得到的结果:

data
  id v1 v2  v3   cat
1  1  1 78 101  9.00
2  1  2 85  NA    NA
3  2  5 56 452 25.65
4  2  4 47  NA    NA
5  3 58 12  NA    NA
6  3  6  3  45  2.70
7  4  4 65   7  3.80
8  4  9 98  56  8.15

v1、v2 和 v3 是数值向量

您可以尝试 rowSumsna.rm = TRUE(如@akrun 在评论中所说),如下所示

data$cat <- rowSums(data[-1] * c(0.05, 0.05, 0.05)[col(data[-1])], na.rm = TRUE)

这给出了

> data
   id v1 v2  v3   cat
1   1  1 78 101  9.00
2   1  2 85  NA  4.35
3   1  5 56 452 25.65
4   1  4 47  NA  2.55
5   1 58 12  NA  3.50
6   1  6  3  45  2.70
7   1  4 65   7  3.80
8   1  9 98  56  8.15
9   2  1 78 101  9.00
10  2  2 85  NA  4.35
11  2  5 56 452 25.65
12  2  4 47  NA  2.55
13  2 58 12  NA  3.50
14  2  6  3  45  2.70
15  2  4 65   7  3.80
16  2  9 98  56  8.15
17  3  1 78 101  9.00
18  3  2 85  NA  4.35
19  3  5 56 452 25.65
20  3  4 47  NA  2.55
21  3 58 12  NA  3.50
22  3  6  3  45  2.70
23  3  4 65   7  3.80
24  3  9 98  56  8.15
25  4  1 78 101  9.00
26  4  2 85  NA  4.35
27  4  5 56 452 25.65
28  4  4 47  NA  2.55
29  4 58 12  NA  3.50
30  4  6  3  45  2.70
31  4  4 65   7  3.80
32  4  9 98  56  8.15

出于计算目的,您可以将 NA 变为 0。

data$cat <- with(replace(data, is.na(data), 0), v1*0.05 + v2*0.05 + v3*0.05)
data

#   id v1 v2  v3   cat
#1   1  1 78 101  9.00
#2   1  2 85  NA  4.35
#3   1  5 56 452 25.65
#4   1  4 47  NA  2.55
#5   1 58 12  NA  3.50
#6   1  6  3  45  2.70
#7   1  4 65   7  3.80
#8   1  9 98  56  8.15
#9   2  1 78 101  9.00
#10  2  2 85  NA  4.35
#11  2  5 56 452 25.65
#12  2  4 47  NA  2.55
#13  2 58 12  NA  3.50
#14  2  6  3  45  2.70
#15  2  4 65   7  3.80
#...
#...