values Что может сделать R о беспорядочном формате данных?




r ggplot legend values (5)

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

Я отправлю пример набора данных здесь, если вопрос будет удален.

+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+

Как вы можете видеть, это неправильный способ публикации данных. Как писал пользователь в комментарии,

Потребовалось немного времени, чтобы форматировать данные так, как вы показываете их здесь. К сожалению, это не очень хороший формат для копирования и вставки.

Я считаю, что все это говорит. Азбука хорошо спланирована, и потребовалось некоторое время и усилия, чтобы попытаться быть приятным, но результат не очень хорош.

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


Короткий ответ на вопрос: да, R-код может решить этот беспорядок, и нет, это не так много неприятностей.

Первый шаг после копирования и вставки таблицы в сеанс R - это прочитать ее с помощью read.table , strip.white аргументы header , sep , comment.char и strip.white .

Кредиты для напоминания мне аргументов comment.char и strip.white идут в @nicola и его комментарий.

dat <- read.table(text = "
+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+
", header = TRUE, sep = "|", comment.char = "+", strip.white = TRUE)

Но, как вы видите, есть некоторые проблемы с результатом.

dat
   X       Date Emp1 Case Priority PriorityCountinLast7days X.1
1 NA 2018-06-01    A   A1        0                        0  NA
2 NA 2018-06-03    A   A2        0                        1  NA
3 NA 2018-06-03    A   A3        0                        2  NA
4 NA 2018-06-03    A   A4        1                        1  NA
5 NA 2018-06-03    A   A5        2                        1  NA
6 NA 2018-06-04    A   A6        0                        3  NA
7 NA 2018-06-01    B   B1        0                        1  NA
8 NA 2018-06-02    B   B2        0                        2  NA
9 NA 2018-06-03    B   B3        0                        3  NA

Чтобы разделители начинали и заканчивали каждую строку данных, сделанную R, полагают, что эти разделители отмечают дополнительные столбцы, что не является тем, что подразумевается под OP исходного вопроса.

Итак, второй шаг - сохранить только настоящие столбцы. Я сделаю это подмножество столбцов по их номерам, легко сделанное, они обычно являются первым и последним столбцами.

dat <- dat[-c(1, ncol(dat))]
dat
          Date   Emp1   Case Priority PriorityCountinLast7days
1  2018-06-01   A      A1           0                        0
2  2018-06-03   A      A2           0                        1
3  2018-06-03   A      A3           0                        2
4  2018-06-03   A      A4           1                        1
5  2018-06-03   A      A5           2                        1
6  2018-06-04   A      A6           0                        3
7  2018-06-01   B      B1           0                        1
8  2018-06-02   B      B2           0                        2
9  2018-06-03   B      B3           0                        3

Это было не слишком сложно, намного лучше.
В этом случае по-прежнему существует проблема, чтобы принудить столбцы Date к классу Date .

dat$Date <- as.Date(dat$Date)

И результат удовлетворительный.

str(dat)
'data.frame':   9 obs. of  5 variables:
 $ Date                    : Date, format: "2018-06-01" "2018-06-03" ...
 $ Emp1                    : Factor w/ 2 levels "A","B": 1 1 1 1 1 1 2 2 2
 $ Case                    : Factor w/ 9 levels "A1","A2","A3",..: 1 2 3 4 5 6 7 8 9
 $ Priority                : int  0 0 0 1 2 0 0 0 0
 $ PriorityCountinLast7days: int  0 1 2 1 1 3 1 2 3

Обратите внимание, что я не установил более или менее стандартные stringsAsFactors = FALSE аргументовAsFactors stringsAsFactors = FALSE . При необходимости это нужно делать при запуске read.table .

Весь процесс занял всего 3 строки базового кода R.

Наконец, конечный результат в формате dput , как и в первую очередь.

dat <-
structure(list(Date = structure(c(17683, 17685, 17685, 17685, 
17685, 17686, 17683, 17684, 17685), class = "Date"), Emp1 = c("A", 
"A", "A", "A", "A", "A", "B", "B", "B"), Case = c("A1", "A2", 
"A3", "A4", "A5", "A6", "B1", "B2", "B3"), Priority = c(0, 0, 
0, 1, 2, 0, 0, 0, 0), PriorityCountinLast7days = c(0, 1, 2, 1, 
1, 3, 1, 2, 3)), row.names = c(NA, -9L), class = "data.frame")

Как было предложено, вы можете использовать dput, чтобы сохранить содержимое фрейма данных в файл, открыть файл в текстовом редакторе и вставить его содержимое. Пример набора данных mtcar, ограниченного первыми 10 строками:

 dput(mtcars %>% head(10), file = 'reproducible.txt') 

Содержимое tibble reproducible.txt можно использовать для создания tibble / tibble как показано ниже. В таком случае данные форматно считываются машиной, но на первый взгляд трудно понять его (без вставки в R).

 df <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6), disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6), hp = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123), drat = c(3.9, 3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92), wt = c(2.62, 2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44), qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0), gear = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 2, 2, 4)), .Names = c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs", "am", "gear", "carb"), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", "Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280"), class = "data.frame") 

Ну, об этом конкретном наборе данных я использовал функцию импорта в RStudio, но я сделал еще один шаг заранее.

  1. Скопируйте набор данных в файл «Блокнот».
  2. Заменить все | символы с ,
  3. Import файл «Блокнот», используя read.csv в RStudio, используя этот код (отдельные столбцы по , ).

Но, если вы имеете в виду использование R, чтобы полностью понять его за один шаг, тогда я понятия не имею.


Использование data.table::fread :

x = '
+------------+------+------+----------+--------------------------+
|    Date    | Emp1 | Case | Priority | PriorityCountinLast7days |
+------------+------+------+----------+--------------------------+
| 2018-06-01 | A    | A1   |        0 |                        0 |
| 2018-06-03 | A    | A2   |        0 |                        1 |
| 2018-06-03 | A    | A3   |        0 |                        2 |
| 2018-06-03 | A    | A4   |        1 |                        1 |
| 2018-06-03 | A    | A5   |        2 |                        1 |
| 2018-06-04 | A    | A6   |        0 |                        3 |
| 2018-06-01 | B    | B1   |        0 |                        1 |
| 2018-06-02 | B    | B2   |        0 |                        2 |
| 2018-06-03 | B    | B3   |        0 |                        3 |
+------------+------+------+----------+--------------------------+
'

fread(gsub('\\+.+\\n' ,'', x, perl = T), drop=c(1,7))

#          Date Emp1 Case Priority PriorityCountinLast7days
# 1: 2018-06-01    A   A1        0                        0
# 2: 2018-06-03    A   A2        0                        1
# 3: 2018-06-03    A   A3        0                        2
# 4: 2018-06-03    A   A4        1                        1
# 5: 2018-06-03    A   A5        2                        1
# 6: 2018-06-04    A   A6        0                        3
# 7: 2018-06-01    B   B1        0                        1
# 8: 2018-06-02    B   B2        0                        2
# 9: 2018-06-03    B   B3        0                        3

Часть gsub удаляет горизонтальные правила. drop удаляет дополнительные столбцы, вызванные разделителями на концах строки.


Проблема заключается не столько в том, сколько строк кода требуется, два или пять, не так много. Вопрос в том, будет ли это работать за пределами примера, который вы разместили здесь.

Я не сталкивался с подобными вещами в дикой природе, но мне пришлось придумать еще несколько примеров, которые, как я думал, могли бы существовать.

dput(mtcars  %>% head(10), file = 'reproducible.txt')

Моя функция

df <- structure(list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1, 14.3,
24.4, 22.8, 19.2), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6), disp = c(160,
160, 108, 258, 360, 225, 360, 146.7, 140.8, 167.6), hp = c(110,
110, 93, 110, 175, 105, 245, 62, 95, 123), drat = c(3.9, 3.9,
3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92), wt = c(2.62,
2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44), qsec = c(16.46,
17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20, 22.9, 18.3), vs = c(0,
0, 1, 1, 0, 1, 0, 1, 1, 1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0,
0), gear = c(4, 4, 4, 3, 3, 3, 3, 4, 4, 4), carb = c(4, 4, 1,
1, 2, 1, 4, 2, 2, 4)), .Names = c("mpg", "cyl", "disp", "hp",
"drat", "wt", "qsec", "vs", "am", "gear", "carb"), row.names = c("Mazda RX4",
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout",
"Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280"), class = "data.frame")




dataframe