Данные упакованы безобразно в R - PullRequest
1 голос
/ 05 апреля 2020

У меня есть проблема с уборкой, которая просто не исчезнет go, на самом деле я понятия не имею, как go об этом прямо сейчас.

У меня есть тиббл, в котором Id первого столбца хранит целочисленный идентификатор, а значения второго столбца выглядят примерно так: «2,3 (09/13) 2,6 (10/14) 2,9 (4/15)» Итак, нумерация c (Дата) Нумери c (Дата) Нумерация c (Дата) и т. Д.

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

Пример данных:

1 0,2 (01/17) 0,19 (02/17) 0,254 (03/17) 0,26 (07/17) 0,217 (09/17) 0,72 (11/17) 0,896 (11/17)

2 0,144 (06/17) 0,171 (08/17) 0,21 (11/17)

Я ищу что-то вроде: 1 0,2 01/17 1 0,19 02/17 1 0,254 03/17. ..

То, что я хотел бы сделать, это преобразовать это в нечто вроде долгоформатированного списка. Я пытался использовать

separate(tibble,
         col = "values",
         into = c("a","b","c","d","e","f","g","h","i","l"),
         sep=c("\\(","\\)")
)

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

Я всегда только изучал Java и тому подобное, так что этот вид логики c для меня очень новый.

Спасибо!

... И извините, я не знаю, как отформатировать данные в таблицы.

РЕДАКТИРОВАТЬ: Извините, я не ясно объяснил, как я отформатировал мои данные! Правильное форматирование: c (1,2), c (0,2 (01/17) 0,19 (02/17) 0,254 (03/17) 0,26 (07/17) 0,217 (09/17) 0,72 (11 / 17) 0,896 (11/17), 0,144 (06/17) 0,171 (08/17) 0,21 (11/17)) Извините, но я могу получить ответ от @ jay.sf на работу, большое спасибо !

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Код:

do.call('rbind', unlist(
  apply(df, 1, function(x){
    lapply(strsplit(x, ")", fixed = TRUE), function(y) {
      m <- do.call('rbind', strsplit(y, "(", fixed = TRUE))
      m <- as.data.frame(m, stringsAsFactors = FALSE)
      names(m) <- c('val', 'date')
      m$val <- as.numeric(m$val)
      m
    })
  } ), recursive = FALSE))


#             val  date
# values.1  0.200 01/17
# values.2  0.190 02/17
# values.3  0.254 03/17
# values.4  0.260 07/17
# values.5  0.217 09/17
# values.6  0.720 11/17
# values.7  0.896 11/17
# values.11 0.144 06/17
# values.21 0.171 08/17
# values.31 0.210 11/17

Данные:

df <- read.table(text='values
                 1        0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)

                 2        0.144(06/17)0.171(08/17)0.21(11/17)', stringsAsFactors = FALSE, header = TRUE)
0 голосов
/ 05 апреля 2020

Подход Base R, объединяющий strsplit результат в матрицу.

res <- do.call(rbind.data.frame, Map(function(x, y)
  transform(data.frame(id=y, matrix(el(strsplit(x, "[()]")), ncol=2, b=T)),
            X1=as.numeric(levels(X1))[X1]), 
  Map(`[`, strsplit(x, " "), 2), substr(x, 1, 1)))
res
#    id    X1    X2
# 1   1 0.200 01/17
# 2   1 0.190 02/17
# 3   1 0.254 03/17
# 4   1 0.260 07/17
# 5   1 0.217 09/17
# 6   1 0.720 11/17
# 7   1 0.896 11/17
# 8   2 0.144 06/17
# 9   2 0.171 08/17
# 10  2 0.210 11/17

Данные

x <- c("1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)",
       "2 0.144(06/17)0.171(08/17)0.21(11/17)")
...