Преобразование короткого широкого фрейма данных в длинный описательный отчет с произвольным текстом

Я импортировал данные, относящиеся примерно к 70 человеческим субъектам, из трех таблиц данных и объединил их в один фрейм данных в R. Некоторые из 100 полей являются прямыми, такими как дата.рождения, число.операций.жизнь и число.операций.12 месяцев. . Другие поля, такие как «комментарии», могут не содержать значения или содержать одно или даже несколько предложений.

У некоторых людей есть аномалия, что означает, что чего-то не хватает или что-то не так, и для этих людей я должен вручную исследовать, что случилось. Когда я открываю фрейм данных как фрейм данных или даже как таблицу в fix(), его трудно читать. Мне приходится прокручивать слева направо, а затем мне приходится расширять некоторые столбцы на смехотворную величину, чтобы прочитать только один комментарий.

Было бы намного лучше, если бы я мог подгруппировать 5 пациентов, которые мне нужны для исследования, и представить данные в виде свободного текста. Я думал, что смогу сделать это, экспортируя в csv, но трудно понять, какие поля какие. Например, 2001-01-05, 12, 4 прошли тестирование, еще живя в Лос-Анджелесе. Это было легко, представьте, что произойдет, если есть 100 полей, многие из которых являются числами, многие являются датами, есть несколько разных полей для комментариев.

Лучшим способом было бы вывести такой отчет:
дата.рождения:2001-01-05, число.операций.время жизни:12, число.операций.12месяцев:4, комментарии:поговорим с нами о Понедельник
Каждая из 5 записей будет следовать этому формату.
имя поля 1: значение поля 1 запись 1, имя поля 2: значение поля 2 запись 1...
пропустить строку (или что-то простое чтобы увидеть)
имя поля 1: значение поля 1 запись 2, имя поля 2: значение поля 2 запись 2

Как мне это сделать?


person Farrel    schedule 03.02.2011    source источник


Ответы (3)


Как насчет этого?

set.seed(1)
age <- abs(rnorm(10, 40, 20)) 
patient.key <- 101:110
date.birth <- as.Date("2011-02-02") - age * 365
number.surgeries.12months <- rnbinom(10, 1, .5)
number.surgeries.lifetime <- trunc(number.surgeries.12months * (1 + age/10))
comments <- "comments text here"
data <- data.frame(patient.key, 
                   date.birth, 
                   number.surgeries.12months, 
                   number.surgeries.lifetime, 
                   comments)

Подгруппируйте данные по интересующим вас пациентам и полям:

selected.patients <- c(105, 109)
selected.fields <- c("patient.key", "number.surgeries.lifetime", "comments")
subdata <- subset(data[ , selected.fields], patient.key %in% selected.patients)

Отформатируйте результат для печати.

# paste the column name next to each data field
taggeddata <- apply(subdata, 1, 
                    function(row) paste(colnames(data), row, sep = ":"))
# paste all the data fields into one line of text
textdata <- apply(taggeddata, 2, 
                  function(rec) do.call("paste", as.list(rec)))
# write to a file or to screen
writeLines(textdata)
person J. Win.    schedule 03.02.2011

Хотя я рискую повториться, я приведу еще один аргумент в пользу пакета RMySQL. Вы сможете редактировать свою базу данных с помощью своего любимого клиента SQL (я рекомендую SequelPro). Используя операторы SELECT/фильтрацию, а затем отредактируйте его. Например

SELECT patentid, patentname, inability FROM patients LIMIT 5 

может отображать только необходимые поля. С помощью хорошего SQL-клиента вы можете напрямую редактировать результат и сохранять его в базе данных. После этого вы можете просто перезагрузить базу данных в R. Я знаю, что многие люди будут утверждать, что ваш набор данных слишком мал для таких накладных расходов, но все же я бы предпочел свойства редактирования большинства редакторов SQL R. То же самое относится к объединение столов, если это становится сложнее. Кроме того, вам может быть интересно написать представления («таблицы», которые обновляются при доступе), которые будут обрабатываться как таблицы в R.

person Matt Bannert    schedule 03.02.2011
comment
Я рассматривал вариант экспорта данных во что-то простое, например базу Microsoft Access или LibreOffice, и использовать его мастер для создания отчета. Есть способы настроить отчет так, чтобы одна строка в базе данных отображалась на нескольких строках. Но даже это заставляет человека придерживаться некоторого пространственного расположения, не зная, получит ли он длинный комментарий или короткий комментарий в одном из полей комментариев. - person Farrel; 04.02.2011

Проверить библиотеку (изменить форму). Я думаю, что если вы начнете с Melt() ваших данных, ваши ноги будут на пути к желаемому результату. Дайте нам знать, если это похоже на то, что это поможет и как это происходит оттуда.

person Neil Best    schedule 03.02.2011
comment
reshape или reshape2 не помогает. Это действительно делает данные длинными. Тем не менее, это слишком долго, и можно бесконечно прокручивать историю с начала до конца. Кроме того, все факторные переменные указаны как номер уровня, а не значение. Таким образом, человек видит 1 и 2 вместо мужского и женского пола для обозначения пола. - person Farrel; 03.02.2011
comment
Это решаемые проблемы. Я не думаю, что они умаляют суть моего ответа. Радость R — это гимнастика с данными! Вы можете конвертировать факторы в строки перед использованием функции Melt(), а также суммировать результаты и проверять их подмножества. - person Neil Best; 04.02.2011