Сохранение символьных / факторных переменных при получении среднего значения набора данных - PullRequest
0 голосов
/ 16 сентября 2018

У меня большой набор данных, пример которого приведен ниже:

# 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 c205b8 c205b9 c205b10 c205c c205d c206a c206b c2071
   <int+lbl> <dbl> <dbl> <int+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+> <dbl+> <dbl+> <dbl+l> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 "BGD 200~  2474 2002  Bangla~ 0.9    6      1       3       1      2         1        1994  2     100   0      0    NA     2    NA     NA   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA       1     2    NA    NA    1    
 2 "BGD 200~  2717 2002  Bangla~ 1.2    6      1       2       1      2         2        1986  4     100   0      0    NA     2    NA     NA   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA       1     1     2     2    2    
 3 "BGD 200~  2410 2002  Bangla~ 0.8    6      1       3       1      2         1        1999  4     100   0      0    NA     2    NA     NA   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA       2    NA    NA    NA    1    
 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     NA     NA      1       1     1     1     2    3    
 5 "BRA 200~ 14546 2003  Brazil~ NA    4      2       2       1      2         2        1976  2     100   0      0     0     2    NA     50    1     NA     NA     NA     NA     NA     NA     NA     NA      1       1     1     1     2    4    
 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     NA     NA     NA       1     1     1     2    4    
 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     NA     NA     NA      NA    NA     1     2    1    
 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     NA     NA     NA       1     2     1     2    4    
 9 "KHM 200~ 16036 2003  Cambod~ 1.2    2      1      21       2      2         2        1997  2     100   0      0     0     2    NA    100   NA      1     NA     NA     NA     NA     NA     NA     NA     NA       1     1     1     2    1    
10 "CHN 200~ 17862 2002  China2~ 1.1    2      2      18       2      2         2        1993  3      49   0     51    NA    NA    NA     NA   NA     NA     NA     NA     NA     NA     NA     NA     NA     NA      NA    NA    NA    NA    2  

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

dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]

В этой операции отбрасываются 7 факторных переменных, представляющих строки, потому что, очевидно, нет взвешенного среднего для названия страны. Однако, поскольку я беру среднее значение matchcode, которое представляет собой комбинацию года и страны, информация из тех пропущенных переменных все равно будет иметь смысл (они должны быть идентичны для каждого кода совпадения), и по этой и другим причинам я хотел бы сохранить эти столбцы.

Итак, большой вопрос, как мне это сделать? Могу ли я временно преобразовать эти факторы в числовые значения и преобразовать их обратно после применения взвешенного среднего по столбцам?

1 Ответ

0 голосов
/ 17 сентября 2018

Я решил свою проблему путем подстановки факторов и взятия выборки из этих факторов на matchcode. Это приводит к желаемому результату, потому что, как объяснено в исходном посте, нет изменений в столбцах коэффициента на matchcode

df <- as.data.frame(df)
is.fact <- sapply(df, is.factor)
dffactors <- df[, is.fact]
dffactors <- data.table(dffactors)
df <- data.table(df)
dffactors <- dffactors[,.SD[sample(.N, min(1,.N))],by = matchcode]

Затем я взял среднее значение исходного df:

dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]

И слил образец с dfclevel

dfclevel <- merge(dfclevel , dffactors,  by= "matchcode", all.x = TRUE, allow.cartesian=FALSE)
...