Добавление терминов в длинном формате в R с отсутствующими данными - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь добавить количество раз, когда col1 встречается под переменной name, игнорируя пропущенное значение. Это должно быть 2 раза, но когда я использую функции длины и подсчета, они всегда возвращают 3.

M = data.frame( Name = c('name','name1','name','name1','name','name1'), Col1 = c(NA,1,3,4,5,NA) , Col2 = c(1,1,NA,5,8,4))

myData <- aggregate(M[,2],
                    by = list(VAR = M$Name), 
                    FUN = function(x) c(mean = mean(x,na.rm=T), sd = sd(x,na.rm=T),n=length(x)))
myData <- do.call(data.frame, myData)

myData
#> x.n
#   3
#I want it to say 2 becuase the number only appears twice this variable. 
#> x.n
#   2

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вот решение tidyverse

library(tidyverse);
M %>%
    gather(k, v, -Name) %>%
    filter(complete.cases(.) & k == "Col1") %>%
    group_by(Name) %>%
    summarise(mean = mean(v), sd = sd(v), n = n())
## A tibble: 2 x 4
#  Name   mean    sd     n
#  <fct> <dbl> <dbl> <int>
#1 name   4.00  1.41     2
#2 name1  2.50  2.12     2

Объяснение: Мы изменяем форму с широкого на длинный, удаляем строки с записями NA через complete.cases и вычисляем необходимую сводную статистику по Name -группированным записям.

0 голосов
/ 03 июля 2018

Попробуйте отредактировать вашу функцию, включив na.omit(x), как показано ниже -

M = data.frame( Name = c('name','name1','name','name1','name','name1'), Col1 = c(NA,1,3,4,5,NA) , Col2 = c(1,1,NA,5,8,4))

myData <- aggregate(M[,2],
                    by = list(VAR = M$Name), 
                    FUN = function(x) c(mean = mean(x,na.rm=T), sd = sd(x,na.rm=T),n=length(na.omit(x))))
myData <- do.call(data.frame, myData)

#     VAR x.mean     x.sd x.n
# 1  name    4.0 1.414214   2
# 2 name1    2.5 2.121320   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...