В R, пытаясь преобразовать рваный CSV в data.frame значения, список - PullRequest
0 голосов
/ 07 января 2019

У меня есть входной файл вроде:

1A10, 77002, 77003, 77010, 77020
1A20, 77002, 77006, 77007, 77019
1A30, 77006, 77019, 77098
1A40, 77007, 77019, 77027, 77098
1A50, 77005, 77007, 77019, 77024, 77027, 77046, 77081, 77098, 77401
etc....

Я хочу создать фрейм данных (tibble), в котором первый столбец совпадает с первым столбцом моего csv, а второй столбец - это список, соответствующий остальным столбцам.

Я с треском провалился. Вот мой последний провал

library(stringr)
library(tidyverse)

options(stringsAsFactors = FALSE)

infile <- "~/Rprojects/CrimeStats/BeatZipcodes.csv"

# create empty data frame
BeatToZip <- data_frame(
    beat=character(),
    zips=list()
)

con=file(infile,open="r")
line=readLines(con) 
long=length(line)
for (i in 1:long){
    print(line[i])
    line[i] <- trimws(line[i])
    beat <- str_split(line[i],", *")[[1]][1]
    zips <- as.list(str_split(line[i],", *")[[1]][-1])
    temp <- data_frame(beat, zips)
    BeatToZip <- rbind(BeatToZip, temp)
}
close(con)

1 Ответ

0 голосов
/ 07 января 2019

Один вариант после чтения файла с read.csv и fill = TRUE

library(tidyverse)
df1 <- read.csv(infile, fill = TRUE, header = FALSE)

gather все столбцы, кроме first, сгруппированные по первому столбцу, summarise другие столбцы в list

df1 %>%
   gather(key, val, -1, na.rm = TRUE) %>%
   group_by(key) %>%
   summarise(listCol = list(val))
...