#r #dataframe #csv #tidyverse #spss
#r #фрейм данных #csv #tidyverse #spss
Вопрос:
У меня есть небольшой набор данных, написанный на синтаксисе SPSS, который взят из таблицы 5.3 стр. 189 этой книги (введите 210
в поле страницы, чтобы увидеть таблицу).
Мне было интересно, может ли быть способ преобразовать эти данные в .csv
файл? (Я хочу использовать данные R
впоследствии)
# SPSS Code:
DATA LIST FREE/gpid anx socskls assert.
BEGIN DATA.
1 5 3 3 1 5 4 3 1 4 5 4 1 4 5 4
1 3 5 5 1 4 5 4 1 4 5 5 1 4 4 4
1 5 4 3 1 5 4 3 1 4 4 4
2 6 2 1 2 6 2 2 2 5 2 3 2 6 2 2
2 4 4 4 2 7 1 1 2 5 4 3 2 5 2 3
2 5 3 3 2 5 4 3 2 6 2 3
3 4 4 4 3 4 3 3 3 4 4 4 3 4 5 5
3 4 5 5 3 4 4 4 3 4 5 4 3 4 6 5
3 4 4 4 3 5 3 3 3 4 4 4
END DATA.
РЕДАКТИРОВАТЬ — чтобы проверить ответы, я добавляю сюда фактический способ отображения данных после их чтения в SPSS :
gpid anx socskls assert
1 5 3 3
1 5 4 3
1 4 5 4
1 4 5 4
1 3 5 5
1 4 5 4
1 4 5 5
1 4 4 4
1 5 4 3
1 5 4 3
1 4 4 4
2 6 2 1
2 6 2 2
2 5 2 3
2 6 2 2
2 4 4 4
2 7 1 1
2 5 4 3
2 5 2 3
2 5 3 3
2 5 4 3
2 6 2 3
3 4 4 4
3 4 3 3
3 4 4 4
3 4 5 5
3 4 5 5
3 4 4 4
3 4 5 4
3 4 6 5
3 4 4 4
3 5 3 3
3 4 4 4
Комментарии:
1. Такие инструменты редактирования текста
notepad
, как функция выбора типа столбца, которая позволяет вырезать и вставлять данные из 4 групп столбцов в 1 группу. затемreader::read_table
можно пройти оставшуюся часть пути.2. Уважаемый Eli-k, можете ли вы также скопировать таблицу SPSS manova, представленную на странице 191 этой книги ?
Ответ №1:
Если я правильно понимаю, 1-й, 5-й, 9-й и 13-й столбцы набора данных принадлежат переменной gpid
, 2-й, 6-й, 10-й и 14-й столбцы принадлежат переменной anx
и так далее. Итак, нам нужно
- изменить формат с широкого на длинный
- с несколькими переменными измерения
- где каждая переменная измерения охватывает несколько столбцов
- и где отсутствуют некоторые значения.
Многие дороги ведут в Рим.
Это то, что я бы сделал, используя мои любимые инструменты. В частности, этот подход использует функцию data.table::melt()
для изменения формы нескольких столбцов измерения одновременно. Ручная очистка раздела данных в текстовом редакторе не требуется.
Полученный набор result
данных может быть использован непосредственно после этого в любом последующем R
коде по запросу OP. Нет необходимости обходить с помощью .csv
файла (однако, не стесняйтесь сохранять result
в виде .csv
файла).
library(data.table)
library(magrittr)
cols <- c("gpid", "anx", "socskls", "assert")
raw <- fread(text = "
1 5 3 3 1 5 4 3 1 4 5 4 1 4 5 4
1 3 5 5 1 4 5 4 1 4 5 5 1 4 4 4
1 5 4 3 1 5 4 3 1 4 4 4
2 6 2 1 2 6 2 2 2 5 2 3 2 6 2 2
2 4 4 4 2 7 1 1 2 5 4 3 2 5 2 3
2 5 3 3 2 5 4 3 2 6 2 3
3 4 4 4 3 4 3 3 3 4 4 4 3 4 5 5
3 4 5 5 3 4 4 4 3 4 5 4 3 4 6 5
3 4 4 4 3 5 3 3 3 4 4 4",
fill = TRUE)
mv <- colnames(raw) %>%
matrix(ncol = 4L, byrow = TRUE) %>%
as.data.table() %>%
setnames(new = cols)
result <- melt(raw, measure.vars = mv, na.rm = TRUE)[
order(rowid(variable))][
, variable := NULL]
result
gpid anx socskls assert 1: 1 5 3 3 2: 1 5 4 3 3: 1 4 5 4 4: 1 4 5 4 5: 1 3 5 5 6: 1 4 5 4 7: 1 4 5 5 8: 1 4 4 4 9: 1 5 4 3 10: 1 5 4 3 11: 1 4 4 4 12: 2 6 2 1 13: 2 6 2 2 14: 2 5 2 3 15: 2 6 2 2 16: 2 4 4 4 17: 2 7 1 1 18: 2 5 4 3 19: 2 5 2 3 20: 2 5 3 3 21: 2 5 4 3 22: 2 6 2 3 23: 3 4 4 4 24: 3 4 3 3 25: 3 4 4 4 26: 3 4 5 5 27: 3 4 5 5 28: 3 4 4 4 29: 3 4 5 4 30: 3 4 6 5 31: 3 4 4 4 32: 3 5 3 3 33: 3 4 4 4 gpid anx socskls assert
Некоторые пояснения
fread()
возвращает data.table raw
с именами столбцов по умолчанию V1
, V2
, … V16
и с пропущенными значениями, заполненными NA
mv
это data.table, который указывает, какие столбцы raw
принадлежат каждой целевой переменной:
mv
gpid anx socskls assert 1: V1 V2 V3 V4 2: V5 V6 V7 V8 3: V9 V10 V11 V12 4: V13 V14 V15 V16
Эта информация используется melt()
. melt()
также удаляет строки с пропущенными значениями из результирующего длинного формата.
После изменения формы строки упорядочиваются по номеру переменной, но их необходимо изменить в исходном порядке строк с помощью rowid(variable)
. Наконец, variable
столбец удаляется.
РЕДАКТИРОВАТЬ: улучшенная версия
Еще раз подумав, вот упрощенная версия кода, которая пропускает создание mv
и использует data.table
цепочку:
library(data.table)
cols <- c("gpid", "anx", "socskls", "assert")
result <- fread(
text = "
1 5 3 3 1 5 4 3 1 4 5 4 1 4 5 4
1 3 5 5 1 4 5 4 1 4 5 5 1 4 4 4
1 5 4 3 1 5 4 3 1 4 4 4
2 6 2 1 2 6 2 2 2 5 2 3 2 6 2 2
2 4 4 4 2 7 1 1 2 5 4 3 2 5 2 3
2 5 3 3 2 5 4 3 2 6 2 3
3 4 4 4 3 4 3 3 3 4 4 4 3 4 5 5
3 4 5 5 3 4 4 4 3 4 5 4 3 4 6 5
3 4 4 4 3 5 3 3 3 4 4 4",
fill = TRUE, col.names = rep(cols, 4L))[
, melt(.SD, measure.vars = patterns(cols), value.name = cols, na.rm = TRUE)][
order(rowid(variable))][
, variable := NULL][]
result
Здесь столбцы переименовываются в вызове to fread()
. В этом случае желательно использовать дублированные имена столбцов (в отличие от обычного варианта использования), поскольку patterns()
функция при последующем вызове будет melt()
использовать дублированные имена столбцов для объединения столбцов, принадлежащих одной переменной измерения.
Ответ №2:
Для этого требуется некоторая ручная очистка в Блокноте или аналогичном, чтобы поместить данные в правильный формат. Но, по сути, это можно импортировать, используя следующее
df <- data.frame(
gpid = c(1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,
2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3),
anx = c(5,5,4,4,3,4,4,4,5,5,4,6,6,5,6,
4,7,5,5,5,5,6,4,4,4,4,4,4,4,4,4,5,4),
socskls = c(3,4,5,5,5,5,5,4,4,4,4,2,2,2,2,
4,1,4,2,3,4,2,4,3,4,5,5,4,5,6,4,3,4),
assert = c(3,3,4,4,5,4,5,4,3,3,4,1,2,3,2,
4,1,3,3,3,3,3,4,3,4,5,5,4,4,5,4,3,4)
)
write.csv(df, "df.csv", row.names = F)
Обратите внимание, что первые 4 значения (1, 5, 3, 3) — это значения gpid, anx, socskls и assert для строки 1. В то время как значения 1, 5, 4, 3, которые, как представляется, находятся в следующем столбце вставленных данных в синтаксисе SPSS (т. Е. Следующие 4 значения, считывающие синтаксис слева направо), на самом деле являются значениями для участника 10.
Примечание: я предполагаю, что у вас не установлен SPSS. Если бы вы это сделали, самым простым вариантом было бы использовать синтаксис SPSS для создания набора данных в SPSS, а затем просто экспортировать в R.
Ответ №3:
Использование readLines
и некоторые инструменты для обработки строк.
tmp <- readLines("spss1.txt") ## read from .txt
tmp <- trimws(gsub("[A-Z/.]", "", tmp)) ## remove caps and specials
nm <- strsplit(tmp[[1]], " ")[[1]] ## split names
tmp <- unlist(strsplit(tmp[3:11], "\s{2,}") ) ## split data blocks
Наконец, разделение на пробелы дает результат.
dat <- setNames(
type.convert(do.call(rbind.data.frame, strsplit(tmp, "\s"))),
nm)
Результат
dat
# gpid anx socskls assert
# 1 1 5 3 3
# 2 1 5 4 3
# 3 1 4 5 4
# 4 1 4 5 4
# 5 1 3 5 5
# 6 1 4 5 4
# 7 1 4 5 5
# 8 1 4 4 4
# 9 1 5 4 3
# 10 1 5 4 3
# 11 1 4 4 4
# 12 2 6 2 1
# 13 2 6 2 2
# 14 2 5 2 3
# 15 2 6 2 2
# 16 2 4 4 4
# 17 2 7 1 1
# 18 2 5 4 3
# 19 2 5 2 3
# 20 2 5 3 3
# 21 2 5 4 3
# 22 2 6 2 3
# 23 3 4 4 4
# 24 3 4 3 3
# 25 3 4 4 4
# 26 3 4 5 5
# 27 3 4 5 5
# 28 3 4 4 4
# 29 3 4 5 4
# 30 3 4 6 5
# 31 3 4 4 4
# 32 3 5 3 3
# 33 3 4 4 4
Примечание: результат такой же, как у метода @emily-kothe. Может быть, авторы использовали другие данные или ваш метод manova ошибочен?