Коэффициент ICPSR в число c преобразование - PullRequest
0 голосов
/ 18 июня 2020

Я использую RDA-файл набора данных ICPSR. Набор данных загружается по этой ссылке и включает код преобразования: https://www.icpsr.umich.edu/web/ICPSR/studies/36346#. Набор данных состоит из около 2600 переменных (демографические c, здоровье и т.д. c.) Для примерно 4000 субъектов.

Они предоставили код для преобразования переменных из фактора в числовые c:

"factor_to_numeric_icpsr.R 2012/12/06

Преобразование переменной фактора R обратно в число c в кадре данных R, созданном ICPSR. Это работает, потому что исходные числовые коды c были добавлены ICSPR к уровням фактора в процессе преобразования исходной числовой переменной c категориальной переменной в фактор во время генерации кадра данных R.

ТРЕБУЕТСЯ функция add.value.labels из пакета prettyR http://cran.r-project.org/web/packages/prettyR/index.html

Замените фактические имена переменных и фреймов данных на заполнители df $ MYVAR в синтаксисе ниже.

 data frame = df
 variable   = MYVAR

Построчные комментарии:

(1) Загрузите пакет prettyR

(2) Создайте объект (фунты), содержащий уровни факторов для указанной переменной. Сортировка будет осуществляться по числовым c как исходные коды (с нулями, если необходимо), мы re сохраняется на уровнях факторов.

(3) Удалите исходные коды из фунтов, оставив только метки значений, например, "(01) СОВЕРШЕННО НЕ СОГЛАСНО" становится "СОВЕРШЕННО НЕ СОГЛАСНО" ) Удалите метки из данных, оставив только исходные коды, например, "(01) НАСТОЯТЕЛЬНО НЕ СОГЛАСНО" становится "1". Затем приведите переменную к numeri c.

(5) Добавьте метки значений, сделав это именованным numeri c vector "

lbls <- sort(levels(df$MYVAR))
lbls <- (sub("^\\([0-9]+\\) +(.+$)", "\\1", lbls))
df$MYVAR <- as.numeric(sub("^\\(0*([0-9]+)\\).+$", "\\1", df$MYVAR))
df$MYVAR <- add.value.labels(df$MYVAR, lbls)

Я пытаюсь найти способ сделать это для ВСЕХ переменных во фрейме данных, но я не смог. Есть ли способ указать все переменные вместо одной переменной («MYVAR»)? Я не хочу повторять эту процедуру для каждой переменной, потому что их 2613.

Например, я могу успешно использовать это для преобразования единственной переменной «C1PAA2J» из множителя в числовое c:

class(df$C1PAA2J)
'factor'

lbls <- sort(levels(df$C1PAA2J))
lbls <- (sub("^\\([0-9]+\\) +(.+$)", "\\1", lbls))
df$C1PAA2J <- as.numeric(sub("^\\(0*([0-9]+)\\).+$", "\\1", df$C1PAA2J))
df$C1PAA2J <- add.value.labels(df$C1PAA2J, lbls)

class(df$C1PAA2J)
'numeric'

Отлично, который работает для одной переменной! Но есть 2613 переменных, которые все нужно преобразовать в numeri c. Как я могу преобразовать их все в numeri c с помощью этого синтаксиса?

Я пробовал это, пытаюсь применить код ко всем строкам и столбцам с 1 по 2613:

lbls <- sort(levels(df[,1:2613]))
lbls <- (sub("^\\([0-9]+\\) +(.+$)", "\\1", lbls))
df[,1:2613] <- as.numeric(sub("^\\(0*([0-9]+)\\).+$", "\\1", df[,1:2613]))
df[,1:2613] <- add.value.labels(df[,1:2613], lbls)

Но я получаю предупреждение «Предупреждающее сообщение: NA, введенное принуждением», и ВСЕ значения для ВСЕХ переменных становятся NA! Набор данных полностью протер и повторно размещено с NA.

Другая попытка решения с использованием функции дает другую ошибку:

myfunc <- function(x){
  lbls <- sort(levels(x))
  lbls <- (sub("^\\([0-9]+\\) +(.+$)", "\\1", lbls))
  x <- as.numeric(sub("^\\(0*([0-9]+)\\).+$", "\\1", x))
  x <- add.value.labels(x, lbls)
  x
}

df <- lapply(df, myfunc)

Сначала кажется, что это работает, но останавливается на этой ошибке:

Ошибка в именах (attr (x, "value.labels")) <- value.labels: атрибут 'names' [1] должен иметь ту же длину, что и вектор [0] Кроме того: Предупреждение: В FUN (X [[ i]], ...): </p>

Также, как было предложено, вот результаты dput:

dput( head( dataframe[ , 1:5]))
> dput (head(MIDUS.iii[ , 1:5]))
structure(list(M2ID = c(10001, 10002, 10011, 10015, 10019, 10020
), M2FAMNUM = c(110498, 100001, 110475, 120805, 100009, 100010
), SAMPLMAJ = structure(c(2L, 1L, 2L, 3L, 1L, 1L), .Label = c("(01) MAIN RDD", 
"(02) SIBLING", "(03) TWIN", "(04) CITY OVERSAMPLE", "(13) MILWAUKEE", 
"(14) BOSTON NEW", "(20) MIDUS REFRESHER", "(21) MILWAUKEE REFRESHER"
), class = "factor"), C1STATUS = structure(c(4L, 1L, 4L, 4L, 
4L, 5L), .Label = c("(1) COMPLETED M3 CATI ONLY", "(2) COMPLETED M3 CATI AND SAQ PART 2", 
"(3) COMPLETED M3 CATI AND SAQ PART 1", "(4) COMPLETED M3 CATI AND SAQ PART 1 AND 2", 
"(5) COMPLETED M3 CATI AND M3RE SAQ PART 1 AND 2", "(6) COMPLETED M3 CATI AND SAQ PART 1 AND M3RE SAQ PART 2", 
"(7) COMPLETED M3 CATI AND M3RE SAQ PART 1"), class = "factor"), 
    M3RE_FILTER = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c("(0) M3 SAMPLE", 
    "(1) M3RE SAMPLE"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

Код работает для отдельных переменных. У меня просто не получается применить это к каждой переменной в моем фреймворке данных. Большое вам спасибо.

Желаемое поведение - применить код, указанный к каждой переменной в фрейме данных, а не только к одной конкретной c переменной.

...