У меня есть фрейм данных, состоящий из трех столбцов (см. Пример в коде). первый столбец содержит категории (a), второй столбец - количество наблюдений (b), а третий столбец - среднее значение этих наблюдений (c).
#create a test df
a<-factor(c("aaa","aaa","aaa","ddd","eee","ddd","aaa","ddd"))
b<-c(3,4,1,3,5,7,3,2)
c<-c(1,2,NA,4,5,6,7,NA)
df.abc<-data.frame(a=a,b=b,c=c)
df.abc
Если количество наблюдений было 1 или 2, записи помечались как пропущенные значения (NA).
Итак, цель моей функции - заменить эти пропущенные значения средним значением каждой категории.
Я взял меня, но у меня заработала функция, которая заменяет все недостающие значения для одной категории (в случае, если наблюдение было 1). Это выглядит так:
#function to substitue the missing values in row c by their means
#according to their categories
function.abc<-function(x){
ifelse(
(df.abc[,1]==x)&(df.abc[,2]==1),
mean(df.abc$c[df.abc$a ==x],na.rm=TRUE),
df.abc[,3]
)
}
Тестирование этой функции:
#test the function for the category "ccc"
function.abc("aaa")
Он работает довольно хорошо (но это только среднее, а не среднее значение). Результат:
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 NA
Теперь моя проблема в том, что у меня довольно много категорий (n = 32), и я попытался применить эту функцию к вектору, содержащему мои категории. Простым примером в этом случае будет:
#test the function for a testvector
test.vector<-c("aaa","ddd")
function.abc(test.vector)
вывод:
[1] 1.0 2.0 4.5 4.0 5.0 6.0 7.0 NA
Так что, очевидно, это не сработает ...
Кто-нибудь может помочь мне переставить функцию? Я новичок в программировании, и для меня по-прежнему остается большой проблемой создавать короткие и хорошо работающие функции ...
Изменить:
Я хотел бы, чтобы результат был: [1] 1.000000 2.000000 3.20000 4.000000 5.000000 6.000000 7.000000 5.000000
так что среднее значение группы aaa (3.20000) заменяет значение NA в aaa, а среднее значение группы ddd (5,0000000) заменяет NA в ddd ...
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 5.00000
. - person Señor O   schedule 21.11.2012=c(1,2,7)
, с подсчетами=c(3,4,3)
, то средневзвешенное значение не 3,3333, а скорее 3,2. Если мое понимание постановки задачи неверно, то, возможно, вопрос можно изменить, чтобы прояснить, почему счетчики не должны использоваться при вычислении среднего значения? - person IRTFM   schedule 21.11.2012