Как разбить один столбец с разной длиной строки на несколько в R - PullRequest
0 голосов
/ 28 августа 2018

В моем файле нет заголовков, он находится в одном столбце, а каждая 21-я строка длиннее остальных. Следовательно, он не читает остальную часть строки в этих строках. Единственный способ заставить его работать - это вставить строку с заголовками прямо в файл, но я надеюсь избежать этого, так как у меня много файлов, и это позже вызовет проблемы, так как мне придется потом объединять эти файлы. До сих пор я пробовал разные вещи, такие как strsplit() command. Вот часть моих данных:

1533541940,90,123,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
1533541941,90,124,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
1533541941,90,125,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
1533541944,90,126,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1,#,#,28.00,41.00,#,0,0.60,1.60,#,496,#,450,16,46560,16,173800,#,28.41,45.93,1017.19,135383.00
1533541945,90,127,0,658.06,13.00,50620,0.0000,-1,-1,-1,-1
1533541945,90,128,0,658.06,13.00,50620,0.0000,-1,-1,-1,-1

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

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

вы можете сделать это автоматически, используя readlines () и read.csv ():

read.csv(text= readLines("yourfile.csv", encoding = "utf-8"), header = F)

Редактировать: как упоминалось в вашем комментарии, количество столбцов получено из первых шести строк. Чтобы убедиться, что у вас есть все столбцы (и вас не волнует порядок ваших данных), вы можете запустить:

# library(stringr)
a <- readLines("yourfile.csv", encoding = "utf-8", sep=",") #this will get all the data in the lines
b <- order(sapply(a, function(x){a <- str_count(x, ","); return(a)}),decreasing = T) # This will make sure the longest one will be first so you have the maximum nbr of columns
read.csv(text= a[b], header = F) 
0 голосов
/ 28 августа 2018

это должно сработать

res <- read.csv(text = "1533541940,90,123,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
1533541941,90,124,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
           1533541941,90,125,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1
           1533541944,90,126,0,656.45,13.00,50496,0.0000,-1,-1,-1,-1,#,#,28.00,41.00,#,0,0.60,1.60,#,496,#,450,16,46560,16,173800,#,28.41,45.93,1017.19,135383.00
           1533541945,90,127,0,658.06,13.00,50620,0.0000,-1,-1,-1,-1
           1533541945,90,128,0,658.06,13.00,50620,0.0000,-1,-1,-1,-1", header = FALSE)

вы можете указать путь к файлу в качестве аргумента для read.csv также

Выход:

          V1 V2  V3 V4     V5 V6    V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25
1 1533541940 90 123  0 656.45 13 50496  0 -1  -1  -1  -1          NA  NA      NA  NA  NA      NA      NA  NA
2 1533541941 90 124  0 656.45 13 50496  0 -1  -1  -1  -1          NA  NA      NA  NA  NA      NA      NA  NA
3 1533541941 90 125  0 656.45 13 50496  0 -1  -1  -1  -1          NA  NA      NA  NA  NA      NA      NA  NA
4 1533541944 90 126  0 656.45 13 50496  0 -1  -1  -1  -1   #   #  28  41   #   0 0.6 1.6   # 496   # 450  16
5 1533541945 90 127  0 658.06 13 50620  0 -1  -1  -1  -1          NA  NA      NA  NA  NA      NA      NA  NA
6 1533541945 90 128  0 658.06 13 50620  0 -1  -1  -1  -1          NA  NA      NA  NA  NA      NA      NA  NA
    V26 V27    V28 V29   V30   V31     V32    V33
1    NA  NA     NA        NA    NA      NA     NA
2    NA  NA     NA        NA    NA      NA     NA
3    NA  NA     NA        NA    NA      NA     NA
4 46560  16 173800   # 28.41 45.93 1017.19 135383
5    NA  NA     NA        NA    NA      NA     NA
6    NA  NA     NA        NA    NA      NA     NA

если вам не нужны данные после столбца V12

res < res[,1:12]

Обновление - ответ на вопрос в комментариях:

res2 <- readLines("res.csv", encoding = "utf-8") 
res2 <- strsplit(res2, ",") 
data.table::rbindlist(lapply(res2,
                             function(x) as.data.frame(matrix(x,
                                                              nrow = 1))),
                      fill = TRUE)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...