Выборочно читать текстовый файл в R

Я ищу простое решение для чтения текстового файла, который выглядит так при открытии в Excel:

IDmaster    By_uspto    App_date    Grant_date  Applicant   Cited   
2   1   19671106    19700707    Motorola Inc    1052446 
2   1   19740909    19751028    Gen Motors Corp 1062884 
2   1   19800331    19820817    Amp Incorporated    1082369 
2   1   19910515    19940719    Dell Usa L.P.   389546  
2   1   19940210    19950912    Schueman Transfer    Inc.   1164239
2   1   19940217    19950912    Spacelabs Medical    Inc.   1164336

РЕДАКТИРОВАТЬ: Открытие txt файла в блокноте выглядит так (с запятыми). Последние две строки демонстрируют проблему.

IDmaster,By_uspto,App_date,Grant_date,Applicant,Cited
2,1,19671106,19700707,Motorola Inc,1052446
2,1,19740909,19751028,Gen Motors Corp,1062884
2,1,19800331,19820817,Amp Incorporated,1082369
2,1,19910515,19940719,Dell Usa L.P.,389546
2,1,19940210,19950912,Schueman Transfer, Inc.,1164239
2,1,19940217,19950912,Spacelabs Medical, Inc.,1164336

Проблема в том, что некоторые из имен Applicant содержат запятые, так что они читаются так, как будто они принадлежат другому столбцу, чего на самом деле нет.

Есть ли простой способ а) «научить» R хранить строковые переменные вместе, независимо от запятых между ними б) читать в первых 4 столбцах, а затем добавить дополнительный столбец для всего, что находится за последней запятой?

Учитывая длину данных, я не могу полностью открыть их в Excel, что в противном случае было бы простой альтернативой.


person SJDS    schedule 18.02.2016    source источник
comment
В вашем примере нет запятой. Если у вас формат фиксированной ширины, используйте функцию read.fwf.   -  person    schedule 18.02.2016
comment
Это потому, что я скопировал пример из Excel, поэтому все запятые исчезли. Как уже было сказано, это файл .txt, поэтому все табуляции на самом деле представляют собой запятые. Я также загрузил тот же пример из txt файла.   -  person SJDS    schedule 18.02.2016
comment
Это действительно немного похоже на этот вопрос, но у меня нет разделителей тысяч и проблем с этим, поэтому я не могу применить код. Возможно, его можно было бы настроить так, чтобы он работал, но для этого нужно, чтобы я очень хорошо понимал, как работает gsub, а я этого не понимаю ;(   -  person SJDS    schedule 18.02.2016
comment
Если вы можете использовать sed, вы можете сделать что-то вроде sed 's/,/,"/4' file.csv | sed 's/\(.*\),/\1",/' > newfile.csv, которое по существу заключает в кавычки все после 4-й запятой и до последней запятой и выводит в новый файл.csv. Затем вы можете легко использовать read.csv для чтения.   -  person fishtank    schedule 18.02.2016


Ответы (2)


Если ваш пример написан в файле «Test.csv», попробуйте:

read.csv(text=gsub(', ', ' ', paste0(readLines("Test.csv"),collapse="\n")),
         quote="'",
         stringsAsFactors=FALSE)

Он возвращает:

#   IDmaster By_uspto App_date Grant_date              Applicant   Cited
# 1        2        1 19671106   19700707           Motorola Inc 1052446
# 2        2        1 19740909   19751028        Gen Motors Corp 1062884
# 3        2        1 19800331   19820817       Amp Incorporated 1082369
# 4        2        1 19910515   19940719          Dell Usa L.P.  389546
# 5        2        1 19940210   19950912 Schueman Transfer Inc. 1164239
# 6        2        1 19940217   19950912 Spacelabs Medical Inc. 1164336
person Community    schedule 18.02.2016
comment
Кажется, это работает нормально и гораздо более разумно, чем мой обходной путь :) спасибо! - person SJDS; 18.02.2016
comment
Пожалуйста. Если все ваши данные такие, этого будет достаточно. Но я не уверен, что это сработает для более сложного случая. - person ; 18.02.2016

Это обеспечивает очень глупый обходной путь, но он помогает мне (потому что меня действительно не волнуют имена кандидатов. Однако я надеюсь на лучшее решение.

Шаг 1: Откройте файл .txt в блокноте и добавьте пять имен столбцов V1, V2, V3, V4, V5 (чтобы обязательно зафиксировать имена с несколькими запятыми).

bc <- read.table("data.txt", header = T, na.strings = T, fill = T, sep = ",", stringsAsFactors = F)

library(data.table)

sapply(bc, class)
unique(bc$V5) # only NA so can be deleted
setDT(bc)
bc <- bc[,1:10, with = F]
bc$Cited <- as.numeric(bc$Cited)
  bc$Cited[is.na(bc$Cited)] <- 0
  bc$V1 <- as.numeric(bc$V1)
  bc$V2 <- as.numeric(bc$V2)
  bc$V3 <- as.numeric(bc$V3)
  bc$V4 <- as.numeric(bc$V4)

  bc$V1[is.na(bc$V1)] <- 0
  bc$V2[is.na(bc$V2)] <- 0
  bc$V3[is.na(bc$V3)] <- 0
  bc$V4[is.na(bc$V4)] <- 0

head(bc, 10)
bc$Cited <- with(bc, Cited + V1 + V2 + V3 + V4)

Это глупый патч, но он помогает в этом конкретном контексте.

person SJDS    schedule 18.02.2016