Проблемы с функцией суммирования различных элементов во вложенной структуре данных в R - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь создать простую функцию суммирования некоторых переменных во вложенном наборе данных.

Вот гораздо более простой пример

df <- data.frame(ID=c(1,1,1,1,2,3,3,4,4,4,5,6,7,7,7,7,7,7,7,7),
var=c("A","B","C","D","B","A","D","A","C","D","D","D","A","D","A","A","A","B","B","B"),
N=c(50,50,50,50,298,156,156,85,85,85,278,301,98,98,98,98,98,98,98,98))

Думайте об этом как о блоке данных, содержащем результаты 7 различных исследований. Каждое исследование исследовало одну или несколько переменных (A, B, C, D). Переменные означают

ID = ID соответствующего исследования.

var = Соответствующая переменная, измеренная в каждом исследовании. В некоторых исследованиях измерялась только одна переменная (например, ID = 2, которая содержала только b), некоторые - несколько

N = Размер выборки каждого исследования. То есть каждый идентификатор имеет размер выборки

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

k = сколько исследований измеряли каждую переменную (например, "A")

m = как часто измерялась каждая переменная (независимо от того, измеряли ли переменные более одного раза) - простая частота.

N = размер выборки на переменную - но только один раз на исследование. То есть дублирование для каждого идентификатора исследования не допускается.

Моя текущая версия (я настоящий нуб, поэтому, пожалуйста, прости форму), приводит именно к тому, что я хочу:

  model    km   N
1     A 4 (7) 389
2     B 3 (5) 446
3     C 2 (2) 135
4     D 6 (6) 968

Например, переменная А измерялась 7 раз, но только в 4 исследованиях (т.е. исследование № 7 измеряло ее несколько раз. (Не избыточный) размер выборки составлял N = 389 (не считая нескольких показателей исследования № 7). более одного раза).

(Примечание. Скобки в таблице полезны, поскольку я собираюсь скопировать результаты в документ)

Вот текущая версия кода. Проблемы начинаются с части, содержащей трубы

kmn <- function(data, x, ID, N) {
  m <-table(data[[x]]) 
  k <-apply(table(data[[x]],data[[ID]]), 1, function(x) length(x[x>0]) )
  model <- levels(data[[x]])
  km <- cbind(k,m)
  colnames(km)<-c("k","m")
  km <- paste0(k," (",m,")") 
  smpsize <- data %>% 
    group_by(data[[x]]) %>% 
    summarise(N = sum(N[!duplicated(ID)])) %>% 
    select(N)
  cbind(model,km,smpsize)  
}

kmn(data=df, x="var", ID = "ID", N="N")

Приведенный выше код работает, но только если df-dataframe действительно содержит N-переменную (но не с другим именем переменной). Я предполагаю, что «data%>%» побуждает R посмотреть на фрейм данных и не использовать часть «sum (N ...») как ссылку на вызов.

Я могу предположить, что это выглядит ужасно для кого-то с какой-то идеей:)

Спасибо за любые идеи Хольгер

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

в дополнение к ответу @ fmarm, это также можно сделать без объединения, где группа по 'var', получает количество различных элементов в 'D' (n_distinct), количество строк (n()) и sum недублированных N '

library(dplyr)
df %>% 
  group_by(model = var) %>%
  summarise(km = sprintf("%d (%d)", n_distinct(ID), n()), 
          N = sum(N[!duplicated(N)]))
# A tibble: 4 x 3
#  model km        N
#  <fct> <chr> <dbl>
#1 A     4 (7)   389
#2 B     3 (5)   446
#3 C     2 (2)   135
#4 D     6 (6)   968
0 голосов
/ 04 июля 2019

Сначала удалите дубликаты с помощью функции unique и суммируйте по var.

Во-вторых, возьмите df и сгруппируйте по var, n() даст количество и n_distinct(ID) количество уникальных идентификаторов, затем вы присоединитесь к фрейму данных stats_N

library(dplyr)

stats_N <- df %>% 
  select(ID,var,N) %>% 
  unique() %>% 
  group_by(var) %>% 
  summarise(N=sum(N))

df %>% 
  group_by(var) %>% 
  summarise(n=n(),km=n_distinct(ID)) %>% 
  left_join(stats_N)

# A tibble: 4 x 4
#  var       n    km     N
#  <fct> <int> <int> <dbl>
#1 A         7     4   389
#2 B         5     3   446
#3 C         2     2   135
#4 D         6     6   968
...