Я работаю с файлом, который по сути является дампом данных из нескольких таблиц. Я пытаюсь выполнить две операции с данными. Сначала разбейте файл на несколько файлов по одной таблице. У меня это работает. Во-вторых, я хочу создать фрейм данных со следующей структурой:
| table_name | count | headers |
|------------------|-------|---------------------------|
| sample_table | 5 | header_1,header2,header 3 |
| sample_table_two | 2 | header_1,header_2 |
Предполагается, что столбец «заголовки» является массивом / вектором строк. Всякий раз, когда я пытаюсь запустить код, я получаю следующее сообщение об ошибке:
There were 50 or more warnings (use warnings() to see the first 50)
Выборка выходного сигнала предупреждения:
Warning messages:
1: In rbind(names(probs), probs_f) :
number of columns of result is not a multiple of vector length (arg 1)
2: In x[[jj]][iseq] <- vjj :
number of items to replace is not a multiple of replacement length
Структура colNames
выглядит примерно так, как я ожидал:
$ X4: chr "vendor_uid"
$ X5: chr "error_code"
$ X6: chr "date"
$ X7: chr "status"
$ X8: chr "is_rebuild"
Однако, что касается значения newRow
, последняя запись не соответствует ожиданиям (я предполагал, что это будет вектор).
$ : chr "amphire_status"
$ : int 1
$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 5 variables:
..$ X4: chr "vendor_uid"
..$ X5: chr "error_code"
..$ X6: chr "date"
..$ X7: chr "status"
..$ X8: chr "is_rebuild"
В tableDF
остальные два столбца выглядят разумно, но столбец «заголовки» содержит только имя / заголовок первого столбца.
'data.frame': 2 obs. of 3 variables:
$ tableName: chr "access_log" "amphire_status"
$ count : int 81 1
$ headers :List of 2
..$ : chr "access_uid"
..$ : chr "vendor_uid"
Что я делаю не так. Я прошу прощения, если это очевидная ошибка, поскольку я новичок в R. Я ссылался на этот вопрос ., Но не смог решить мою проблему.
РЕДАКТИРОВАТЬ: Не могу поверить, я забыл добавить свой код:
library(tidyverse)
library(jsonlite)
pollFile <- read_csv("sample.csv", col_names = FALSE)
has_data <- function(x) { sum(!is.na(x)) > 0 }
tableDF <- data.frame("tableName" = character(), "count" = integer(), "headers" = vector(), stringsAsFactors = FALSE)
for(name in levels(factor(pollFile$X1) )){
tmp <- pollFile %>% filter(X1 == name) %>% select(-(X1:X3))
tmp <- tmp %>% select_if(has_data)
colNames <- tmp[1,]
newRow <- list(name, nrow(tmp), as.vector(colNames))
tableDF[nrow(tableDF) + 1, ] <- newRow
if(count(tmp) > 1) {
fn <- paste("poll_table/", name,".csv")
write_csv(tmp,fn,col_names = FALSE)
}
}