Я пытаюсь создать простую функцию суммирования некоторых переменных во вложенном наборе данных.
Вот гораздо более простой пример
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 ...») как ссылку на вызов.
Я могу предположить, что это выглядит ужасно для кого-то с какой-то идеей:)
Спасибо за любые идеи
Хольгер