Как использовать цикл, чтобы добавить 0 к одной категории, если нет значений для этой категории? - PullRequest
0 голосов
/ 09 января 2019

У меня есть два набора данных для сравнения, и я написал функцию для их сравнения

набор данных о населении подобен:

                  yes     no     NA
diease or not      1       9      20

однако в наборе данных образца может отсутствовать одна категория, например:

                       no     NA
diease or not          2      7

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

tablFun6 <- function(x){
  tbl6 <- table(x,exclude=NULL)
  res6 <- c(as.vector(round(tbl6,0)),paste0(as.vector(round(prop.table(tbl6)*100,2)),"%"))
  names(res6) <- c("Yes","No","NA","Yes_Perc","No_Perc","NA_Perc")
  res6
}

и применить его к переменным как в наборе данных о населении, так и в наборе выборочных данных,

dis_popu <- do.call(rbind,lapply(popu[c(154,159,161:166)], 
tablFun6))
dis_samp <- do.call(rbind,lapply(samp[c(154,159,161:166)], 
tablFun6))  

но ошибка всегда происходит:

  Error in names(res6) <- c("Yes", "No", "NA", "Yes_Perc","No_Perc", 
  "NA_Perc") : 'names' attribute [6] must be the same length as the 
  vector [4]

Я знаю, это потому, что мне не хватает одной категории в образце набора данных, а длина имен, которые я назначаю, не соответствует результату "таблицы", но я совершенно не могу понять, как улучшить мои коды.

Я действительно ценю любую помощь, чтобы помочь моему обучению более эффективно. Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Это решение не использует цикл, поэтому дайте мне знать, если вы действительно хотите, и я удалю свой ответ. Я думаю, вы обнаружите, что это гораздо эффективнее.

Скажите R, что disease_or_not является фактором, и явно перечислите все возможные уровни.

> disease_or_not <- factor(c(rep('yes', 5)))
> table(disease_or_not)
disease_or_not
yes 
  5 
> disease_or_not <- factor(c(rep('yes', 5)), levels = c('no', 'yes')) # give the levels directly
> table(disease_or_not) # even though no one has 'no', R puts it in the table
disease_or_not
 no yes 
  0   5 
...