For example, I have this data frame (df):
Color X1 X2 X3 X4
Red 1 1 0 2
Blue 0 NA 4 1
Red 3 4 3 1
Green 2 2 1 0
I would like to create a function that counts up the number of non-NA
s in "X2" by group (i.e. by "color"). I would like the output of this function in a new data frame named newdf. This is what I would like for output:
Color X2
Red 2
Blue NA
Green 1
So far, I have this code:
Question <- function(Color){
Result <-
rowsum((df[c("X2")] > 0) + 0, df[["X2"]], na.rm = TRUE)
rowSums(Result)[[Color]]
}
Question("Red")
The output this function gives is just Question("Red")= 2
and I would like to instead get my results of all the colors in a new data frame (newdf). Can anyone help with this? Thanks!
Or if you wanted to use data.table:
library(data.table)
dt[,sum(!is.na(X2)),by=.(Color)]
Color V1
1: Red 2
2: Blue 0
3: Green 1
Also its easy enough to use an ifelse()
in your data.table to get an NA for blue instead of 0. See:
dt[,ifelse(sum(!is.na(X2)==0),as.integer(NA),sum(!is.na(X2))),by=.(Color)]
Color V1
1: Red 2
2: Blue NA
3: Green 1
Data:
dt <- as.data.table(fread("Color X1 X2 X3 X4
Red 1 1 0 2
Blue 0 NA 4 1
Red 3 4 3 1
Green 2 2 1 0"))
library(dplyr)
df1 <- df %>%
group_by(Color) %>%
summarise(sum(!is.na(X2)))
df1
# (chr) (int)
#1 Red 2
#2 Blue 0
#3 Green 1
and if you really want NA
instead of that 0
then
df1[df1 ==0]<-NA
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With