Во-первых, я учусь использовать dplyr после того, как большую часть своей карьеры использовал base-r (не совсем аналитик данных, но пытаюсь учиться). Я не знаю, подходит ли для этого dplyr или мне следует использовать что-то еще.

У меня есть файл данных, созданный на очень беспорядочном оборудовании. В данные встроены данные заголовка / надгробия (время / дата / местоположение / данные датчика для определенного места между строками данных для этого места). Файлы относительно большие (150 000 наблюдений x 14 переменных), и я успешно использовал dplyr для отделения фактических данных от данных надгробных камней (данные надгробий содержат 6 строк информации, распределенных по 14 столбцам).

Я пытаюсь создать одну строку информации о надгробии, чтобы добавить ее к фактическим измерениям, чтобы ее можно было легко прочитать в R для анализа, не полагаясь на решение «черного ящика» от производителя.

Ниже представлен образец файла данных и моего сценария:

# Read csv file of data into R
data <- read_csv("data.csv", col_names = FALSE)
data
# A tibble: 155,538 x 14
    X1       X2        X3        X4    X5    X6    X7    X8     X9    X10    X11    X12    X13        X14
 <dbl>    <chr>     <chr>     <chr> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>      <dbl>
1      NA    80.00     19.00      0.00  37.0   1.0   0.0  3.00     NA     NA     NA     NA     NA         NA
2 1.4e+01     8.00      6.00     13.00  43.0   9.0  33.0 50.00   1.00  -1.60  -2.00  50.10  14.88         NA
3 5.9e-01     5.15      2.02     -0.57   0.0   0.0   0.0  0.00  24.58  28.02  25.64  25.37     NA         NA
4 0.0e+00     0.00      0.00      0.00   0.0    NA    NA    NA     NA     NA     NA     NA     NA         NA
5 3.0e+04 30000.00 -32768.00 -32768.00   0.0    NA    NA    NA     NA     NA     NA     NA     NA         NA
6 0.0e+00     0.00      0.00      0.00   0.0   0.0   0.0  0.25  20.30     NA     NA     NA     NA         NA
7 3.7e+01       cm        BT    counts   1.0   0.1    NA    NA     NA     NA     NA     NA     NA         NA
8      NA     0.25     13.30    145.46   7.5 -11.0   2.1  0.80 157.00 149.00 158.00 143.00 100.00 2147483647
9      NA     0.35     13.37    144.54   7.8 -10.9   2.4 -0.40 153.00 150.00 148.00 146.00 100.00 2147483647
10     NA     0.45     14.49    144.65   8.4 -11.8   1.8 -0.90 139.00 156.00 151.00 152.00 100.00 2147483647
# ... with 155,528 more rows

# Get header information from file and create index(ens) of header information to later append header data to each line of measured data
header <- data %>%
  filter(!is.na(data[,1])) %>%
  mutate_all(as.character) %>%
  mutate(ens = rep(1:(nrow(header)/6), each = 6)) %>%
  group_by(ens) 

n.head <- bind_cols(header[header$ens == 1,][1,], header[header$ens == 1,][2,], header[header$ens == 1,][3,], header[header$ens == 1,][4,], header[header$ens == 1,][5,], header[header$ens == 1,][6,])

Строки 2: 7 содержат информацию, с которой я пытаюсь работать, я знаю, что создание строки из 90+ переменных не идеально, но это первый шаг в очистке этих данных, чтобы затем я мог с ними работать.

Последняя строка с n.head - это то, что я надеюсь получить, без необходимости писать цикл для выполнения этого ~ 20 000 раз ... Любая помощь будет принята с благодарностью, заранее спасибо за ввод!

1
AlaskaKraska 22 Ноя 2017 в 19:02

1 ответ

Лучший ответ

Уловка здесь состоит в том, чтобы использовать tidy::spread() и tibble::enframe, чтобы распределить столбцы заголовка в единый фрейм данных строки.

library(tidyverse)

header  <- data[2:7] %>% 
  # convert the data frame to a vector
  t %>% 
  as.vector %>% 
  # then change it back into a single row data frame that's in long format
  enframe %>% 
  # then push that back into a wide format, ie. 1 row and a bajillion columns
  spread(name, value)

# replicate the row as many times as you have data
header[2:nrow(actualdata,]  <- header

#use bind_cols() to glue your header rows onto each row of the actual data
actualdata  <- data[7:nrow(data),] %>% 
  bind_cols(foo)
2
crazybilly 22 Ноя 2017 в 17:46