У меня есть следующий набор данных:
# A tibble: 450 x 546
matchcode idstd year country wt region income industry sector ownership exporter c201 c202 c203a c203b c203c c203d c2041 c2042 c205a c205b1 c205b2 c205b3 c205b4 c205b5 c205b6 c205b7
<chr+lbl> <dbl> <dbl> <chr+l> <dbl> <dbl+> <dbl+> <dbl+lb> <dbl+> <dbl+lbl> <dbl+lb> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+>
1 "BGD 200~ 2474 2002 Bangla~ 0.7 6 1 3 1 2 1 1994 2 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA
2 "BGD 200~ 2717 2002 Bangla~ 0.9 6 1 2 1 2 2 1986 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA
3 "BGD 200~ 2410 2002 Bangla~ NA 6 1 3 1 2 1 1999 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA
4 "BRA 200~ 14917 2003 Brazil~ NA 4 2 8 1 2 2 1984 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA
5 "BRA 200~ 14546 2003 Brazil~ 1.1 4 2 2 1 2 2 1976 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA
6 "BRA 200~ 14709 2003 Brazil~ NA 4 2 3 1 2 2 1990 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA
7 "KHM 200~ 16475 2003 Cambod~ NA 2 1 20 2 2 2 1999 2 100 0 0 0 2 NA 100 NA NA NA 1 NA NA NA
8 "KHM 200~ 16298 2003 Cambod~ NA 2 1 4 3 2 2 1993 4 100 0 0 0 2 NA 100 1 NA NA NA NA NA NA
9 "KHM 200~ 16036 2003 Cambod~ 0.5 2 1 21 2 2 2 1997 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA
10 "CHN 200~ 17862 2002 China2~ 1.2 2 2 18 2 2 2 1993 3 49 0 51 NA NA NA NA NA NA NA NA NA NA NA
, и я использую следующее решение data.table для создания данных на уровне страны из данных наблюдений:
cols = sapply(df, is.numeric) #
cols = names(cols)[cols]
dfclevel = df[, lapply(.SD, mean, na.rm=TRUE), .SDcols = cols, by=matchcode]
Хотя код работаету моего набора данных есть weights
для некоторых наблюдений, которые я хочу включить в свой код.Я думал о том, как сделать это, но я не могу понять это.Можно ли написать функцию для добавления в решение data.table?Что-то вроде:
dfclevel = df[, lapply(.SD, wfunc, na.rm=TRUE), .SDcols = cols,]
wfunc <- function(x,y) # x = df, y=weights
for (i in nrow(df$weights) {
if (df$weights[i] == !is.na){
df[,i] <- df[,i]*df$weights[i]
}
Или, может быть, я даже слишком обдумываю это?
РЕДАКТИРОВАТЬ: Основываясь на комментариях ниже, я попытался:
dfclevel= df[, lapply(.SD, weighted.mean(x, as.vector(wt), na.rm=TRUE), na.rm=TRUE), .SDcols = cols, by=matchcode]
взвешенных.значит
Это дает мне ошибку:
Error in weighted.mean(x, as.vector(wt), na.rm = TRUE) :
object 'x' not found
Как мне указать, что x
должен быть столбцом df
?
Iпробовал это, но это не сработало:
dfclevel= df[, lapply(.SD, lapply(weighted.mean(x, as.vector(wt), na.rm=TRUE)), na.rm=TRUE), .SDcols = cols, by=matchcode]
Error in match.fun(FUN) : argument "FUN" is missing, with no default