Как правильно применять функции при наличии значений NA - PullRequest
0 голосов
/ 01 ноября 2018

Я бы хотел вычислить функцию для нескольких столбцов информационного кадра со случайными значениями NA. У меня два вопроса:

  1. Как бороться с АН? Код запускается, когда я пробую его на столбцах без NA, но возвращает NA, когда есть NA, даже если я их удаляю.
  2. Как распечатать результаты в формате данных вместо нескольких массивов? Я использовал mapply, но, похоже, он неправильно выполняет вычисления.

Вот мой код:

#create a data frame with random NAs
df<-data.frame(category1 = sample(c(1:10),100,replace=TRUE),
           category2 = sample(c(1:10),100,replace=TRUE)
)
insert_nas <- function(x) {
   len <- length(x)
   n <- sample(1:floor(0.2*len), 1)
   i <- sample(1:len, n)
   x[i] <- NA 
   x
}
df <- sapply(df, insert_nas) %>% as.data.frame()
df$type <- sample(c("A", "B", "C"),100,replace=TRUE)


#using apply:
library(NPS)
apply(df[,c('category1', 'category2')], 2, 
   function(x) df %>% filter(!is.na(x)) %>% group_by(type) %>%
   transmute(nps(x)) %>% unique()
)
#results:
$category1
# A tibble: 3 x 2
# Groups:   type [3]
type  `nps(x)`
<chr>    <dbl>
1 B           NA
2 A           NA
3 C           NA
...

#using mapply
mapply(function(x) df %>% filter(!is.na(x)) %>% group_by(type) %>%
   transmute(nps(x)) %>% unique(), df[,c('category1', 'category2')])

#results:
       category1   category2  
type   Character,3 Character,3
nps(x) Numeric,3   Numeric,3 

Что касается функции, которую я использую, она не имеет встроенного способа работы с NA, поэтому я удаляю NA до ее вызова.

1 Ответ

0 голосов
/ 01 ноября 2018

Я все еще использовал часть !is.na вашего кода, потому что кажется, что nps не может справиться с NA, хотя в документации сказано, что это должно (возможная ошибка). Я изменил ваш apply на lapply и передал переменные в виде списка. Затем я использовал get, чтобы определить имя переменной, которая появляется в кавычках, как переменную в вашем df.

df<-data.frame(category1 = sample(c(1:10),100,replace=TRUE),
               category2 = sample(c(1:10),100,replace=TRUE)
)
insert_nas <- function(x) {
  len <- length(x)
  n <- sample(1:floor(0.2*len), 1)
  i <- sample(1:len, n)
  x[i] <- NA 
  x
}
df <- sapply(df, insert_nas) %>% as.data.frame()
df$type <- sample(c("A", "B", "C"),100,replace=TRUE)


#using apply:
library(NPS)
df2 <- as.data.frame(lapply(c('category1', 'category2'),  
      function(x) df %>% filter(!is.na(get(x))) %>% group_by(type) %>%
        transmute(nps(get(x))) %>% unique()
),stringsAsFactors = FALSE)

colnames(df2) <- c("type", "nps_cat1","type2","nps_cat2")
#type2 is redundant
df2 <- select(df2, -type2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...