如何在 R 中處理 apply 函式產生的 NA 輸出?


當我們在數值列和字元列上使用 apply 函式時,函式的輸出對所有列都返回 NA。為了解決這個問題,我們可以使用 lapply 函式。lapply 函式會獨立地處理每一列,因此算術運算將分別執行。

請檢視以下示例以瞭解其工作原理。

示例 1

以下程式碼片段建立了一個示例資料框:

x1<-rnorm(20)
x2<-rnorm(20)
x3<-LETTERS[1:20]
df1<-data.frame(x1,x2,x3)
df1

建立了以下資料框:

     x1          x2         x3
1   1.8023520   0.02949008  A
2  -0.6755818   0.03066978  B
3   0.8067009  -1.42504773  C
4  -0.6978446  -0.03589390  D
5  -0.9768782  -2.29225371  E
6   0.7589207  -0.56158056  F
7   1.4361048   0.05587417  G
8   2.2569459  -1.64800771  H
9   1.0998291  -0.67096333  I
10 -0.7250079   1.02007341  J
11 -1.6972296   0.25851780  K
12  2.6042033   1.13646450  L
13  1.3473008  -0.24734074  M
14  0.5262951  -0.56210383  N
15 -0.4576343   0.32515395  O
16  1.2211340   1.18324358  P
17  0.3792386  -0.52471110  Q
18 -0.8220452   0.28614199  R
19 -0.5467174  -1.88444207  S
20 -0.7032419  -1.01928201  T

為了使用 apply 函式查詢 df1 中所有列的平均值,請將以下程式碼新增到上述程式碼片段中:

x1<-rnorm(20)
x2<-rnorm(20)
x3<-LETTERS[1:20]
df1<-data.frame(x1,x2,x3)
apply(df1,2,mean)

輸出

如果您將以上所有程式碼片段作為單個程式執行,它將生成以下輸出:

x1 x2 x3
NA NA NA
Warning messages:
1: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
3: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA

正確的方法是使用 lapply 而不是 apply。請將以下程式碼新增到上述程式碼片段中:

x1<-rnorm(20)
x2<-rnorm(20)
x3<-LETTERS[1:20]
df1<-data.frame(x1,x2,x3)
lapply(df1,mean)

輸出

如果您將以上所有程式碼片段作為單個程式執行,它將生成以下輸出:

$x1
[1] 0.3468422

$x2
[1] -0.3272999

$x3
[1] NA
Warning message:
In mean.default(X[[i]], ...) :
argument is not numeric or logical: returning NA

示例 2

以下程式碼片段建立了一個示例資料框:

ID<-letters[1:20]
Response<-rpois(20,5)
df2<-data.frame(ID,Response)
df2

建立了以下資料框:

   ID Response
1  a  8
2  b  5
3  c  4
4  d  4
5  e  4
6  f  2
7  g  3
8  h  4
9  i  6
10 j  3
11 k  6
12 l  2
13 m  5
14 n  3
15 o  4
16 p  7
17 q  6
18 r  6
19 s  6
20 t  7

為了使用 apply 函式查詢 df2 中所有列的平均值,請將以下程式碼新增到上述程式碼片段中:

ID<-letters[1:20]
Response<-rpois(20,5)
df2<-data.frame(ID,Response)
apply(df2,2,mean)

輸出

如果您將以上所有程式碼片段作為單個程式執行,它將生成以下輸出:

ID Response
NA NA
Warning messages:
1: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA

為了使用 apply 函式查詢 df2 中所有列的平均值,請將以下程式碼新增到上述程式碼片段中:

ID<-letters[1:20]
Response<-rpois(20,5)
df2<-data.frame(ID,Response)
lapply(df2,mean)

輸出

如果您將以上所有程式碼片段作為單個程式執行,它將生成以下輸出:

$ID
[1] NA

$Response
[1] 4.75

Warning message:
In mean.default(X[[i]], ...) :
argument is not numeric or logical: returning NA

更新於: 2021年11月12日

488 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.