Прикрепление меток к столбцам с помощью Hmisc пропускает два ранее удаленных столбца - PullRequest
0 голосов
/ 19 сентября 2018

У меня самая странная проблема, которую я объясню, насколько смогу.Основная проблема заключается в том, что у меня проблема с повторным присоединением меток к библиотеке (Hmisc).При повторном присоединении пропускаются два столбца (S007_01, S010, то есть два столбца, которые были удалены, поскольку они были символьными столбцами S009 и S009A) без видимой причины.В результате перемаркировка начинается правильно, но поскольку она пропускает два столбца, остальные метки заканчиваются неправильными переменными:

enter image description here

У меня большой набор данных с символьными (преобразованными в фактор) и числовыми столбцами.Тиббл в дополнение к структуре нескольких переменных добавлен ниже.

# A tibble: 720 x 1,415
   matchcode S001  S002  S002EVS S003  S003A S004  S006  S007  S007_01    S008  S009  S009A S010  S010_01 S010_02 S010_03 S010_04 S011  S012  S013  S013B S014  S015  S016 
   <fct>     <dbl> <dbl> <dbl+l> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl+lbl>  <dbl> <fct> <fct> <dbl> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 "JPN 198~ 2     1     -4      392   392   -4      81    81  3920120081 -4    JP    JP    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 2 "JPN 198~ 2     1     -4      392   392   -4    1113  1113  3920121113 -4    JP    JP    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 3 "JPN 198~ 2     1     -4      392   392   -4      40    40  3920120040 -4    JP    JP    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 4 "MEX 198~ 2     1     -4      484   484   -4    1780  2972  4840121768 -4    MX    MX    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 5 "MEX 198~ 2     1     -4      484   484   -4     833  2030  4840120826 -4    MX    MX    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 6 "MEX 198~ 2     1     -4      484   484   -4     623  1820  4840120616 -4    MX    MX    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 7 "HUN 198~ 2     1     -4      348   348   -4     736  3777  3480120736 -4    HU    HU    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 8 "HUN 198~ 2     1     -4      348   348   -4     565  3606  3480120565 -4    HU    HU    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
 9 "HUN 198~ 2     1     -4      348   348   -4     388  3429  3480120388 -4    HU    HU    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4   
10 "AUS 198~ 2     1     -4       36    36   -4     421  4926   360120421 -4    AU    AU    -4    -4      -4      -4      -4      -4    -4    -4    -4    -4    -4    -4


str(dfsample)
Classes ‘data.table’ and 'data.frame':  240 obs. of  1415 variables:
 $ matchcode  : Factor w/ 240 levels "ALB 1998 ","ALB 2002 ",..: 108 134 88 12 4 73 117 232 5 25 ...
 $ S001       :Class 'labelled'  atomic [1:240] 2 2 2 2 2 2 2 2 2 2 ...
  .. ..- attr(*, "label")= chr "Study"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:7] -5 -4 -3 -2 -1 1 2
  .. .. ..- attr(*, "names")= chr [1:7] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S002       :Class 'labelled'  atomic [1:240] 1 1 1 1 1 1 1 1 2 2 ...
  .. ..- attr(*, "label")= chr "Wave"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:11] -5 -4 -3 -2 -1 1 2 3 4 5 ...
  .. .. ..- attr(*, "names")= chr [1:11] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S002EVS    :Class 'labelled'  atomic [1:240] -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
  .. ..- attr(*, "label")= chr "EVS-wave"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:9] -5 -4 -3 -2 -1 1 2 3 4
  .. .. ..- attr(*, "names")= chr [1:9] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S003       :Class 'labelled'  atomic [1:240] 392 484 348 36 32 246 410 710 32 112 ...
  .. ..- attr(*, "label")= chr "Country/region"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:199] -5 -4 -3 -2 -1 4 8 12 16 20 ...
  .. .. ..- attr(*, "names")= chr [1:199] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S003A      :Class 'labelled'  atomic [1:240] 392 484 348 36 32 246 410 710 32 112 ...
  .. ..- attr(*, "label")= chr "Country/regions [with split ups]"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:199] -5 -4 -3 -2 -1 4 8 12 16 20 ...
  .. .. ..- attr(*, "names")= chr [1:199] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S004       :Class 'labelled'  atomic [1:240] -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
  .. ..- attr(*, "label")= chr "Set"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:7] -5 -4 -3 -2 -1 1 2
  .. .. ..- attr(*, "names")= chr [1:7] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
$ S008       :Class 'labelled'  atomic [1:720] -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
  .. ..- attr(*, "label")= chr "Interviewer number"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:5] -5 -4 -3 -2 -1
  .. .. ..- attr(*, "names")= chr [1:5] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S009       : Factor w/ 100 levels "AD","AL","AM",..: 47 47 47 61 61 61 39 39 39 5 ...
 $ S009A      : Factor w/ 101 levels "AD","AL","AM",..: 48 48 48 62 62 62 40 40 40 5 ...
 $ S010       :Class 'labelled'  atomic [1:720] -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
  .. ..- attr(*, "label")= chr "Total length of interview"
  .. ..- attr(*, "format.stata")= chr "%12.0g"
  .. ..- attr(*, "labels")= Named num [1:5] -5 -4 -3 -2 -1
  .. .. ..- attr(*, "names")= chr [1:5] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...
 $ S010_01    :Class 'labelled'  atomic [1:720] -4 -4 -4 -4 -4 -4 -4 -4 -4 -4 ...
  .. ..- attr(*, "label")= chr "Time of interview: start hour"
  .. ..- attr(*, "format.stata")= chr "%8.0g"
  .. ..- attr(*, "labels")= Named num [1:5] -5 -4 -3 -2 -1
  .. .. ..- attr(*, "names")= chr [1:5] "Missing; Unknown" "Not asked in survey" "Not applicable" "No answer" ...

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

# 1.Select numerical columns to calculate weighted average of
cols = sapply(df, is.numeric) # https://stackoverflow.com/questions/26082889/calculate-summary-statistics-e-g-mean-on-all-numeric-columns-using-data-table
cols = names(cols)[cols]

#2. Separate factor variables, to be added back again later
df <- as.data.frame(df)
ind1 <- names(df )[ sapply(df , is.factor) ]
dffactors<- df[ind1]
dffactors<- as.data.table(dffactors)
dffactors<- dffactors[,.SD[sample(.N, min(1,.N))],by = matchcode]

# 3. Taking the labels because the next operations removes the labels
dfclevellabels <- setNames(stack(lapply(df, label))[2:1], c("rn", "Variables"))
# Remove the factor labels from the collected labels because these are not in the weighted mean dataset (so they should not be added back).
dfclevellabels <- dfclevellabels [!(dfclevellabels $Variables==""),]
# reset the rownames because I thought this could be the reason for the issue.
rownames(dfclevellabels ) <- seq(length=nrow(dfclevellabels )) 

# 4. take the weighted.mean, which **drops the factor variables and labels**
df <- as.data.table(df)
dfclevel = df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode] #  character variables dropped

# 5. So at this moment I want to re-add the labels
for (i in seq_len(ncol(dfclevel))) {
  Hmisc::label(dfclevel [[dfclevellabels$`rn`[i+1]]]) <- dfclevellabels$Variables[i]

Теперь вот странная вещь;когда я использую ncol(dfclevel), назначение меток работает, однако оно пропускает столбцы 9 и 10, именно те, которые раньше были символьными переменными.

Когда я использую ncol(dfclevellabels), он просто добавляет первые две метки.Метки других (при использовании getlabels) отображаются как пустые строки.Кажется, что-то еще происходит каждый раз.Я перепробовал все, чтобы это исправить, но я нахожусь в конце моего остроумия здесь.Есть ли очевидная проблема в моем коде?

Есть предложения?

...