- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
How to deal with NA output of apply in R?
When we use apply function on numerical as well as character column then the output of the function returns NA for all hence to deal with this problem, we can use lapply function. The lapply function will take each column into account independently, therefore, the arithmetic operations will be performed individually.
Check out the below given examples to understand how it works.
Example 1
Following snippet creates a sample data frame −
x1<-rnorm(20) x2<-rnorm(20) x3<-LETTERS[1:20] df1<-data.frame(x1,x2,x3) df1
The following dataframe is created −
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
In order to find the mean of all columns in df1 using apply function, add the following code to the above snippet −
x1<-rnorm(20) x2<-rnorm(20) x3<-LETTERS[1:20] df1<-data.frame(x1,x2,x3) apply(df1,2,mean)
Output
If you execute all the above given snippets as a single program, it generates the following output −
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
The correct way is to use lapply instead of apply. Add the following code to the above snippet −
x1<-rnorm(20) x2<-rnorm(20) x3<-LETTERS[1:20] df1<-data.frame(x1,x2,x3) lapply(df1,mean)
Output
If you execute all the above given snippets as a single program, it generates the following output −
$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
Example 2
Following snippet creates a sample data frame −
ID<-letters[1:20] Response<-rpois(20,5) df2<-data.frame(ID,Response) df2
The following dataframe is created −
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
To find the mean of all columns in df2 using apply function, add the following code to the above snippet −
ID<-letters[1:20] Response<-rpois(20,5) df2<-data.frame(ID,Response) apply(df2,2,mean)
Output
If you execute all the above given snippets as a single program, it generates the following output −
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
To find the mean of all columns in df2 using apply function, add the following code to the above snippet −
ID<-letters[1:20] Response<-rpois(20,5) df2<-data.frame(ID,Response) lapply(df2,mean)
Output
If you execute all the above given snippets as a single program, it generates the following output −
$ID [1] NA $Response [1] 4.75 Warning message: In mean.default(X[[i]], ...) : argument is not numeric or logical: returning NA