Как использовать colClass в R для столбцов, соответствующих определенному имени во fread()

#r #fread #grepl

#r #fread #grepl

Вопрос:

На данный момент я импортирую свой набор данных в R, используя следующий код:

 require(data.table)
require(QuantPsyc)
library(lmSupport)
library(dbplyr)

#Import OID Label Data based on Open Image Data Set only
flickrcar <- fread("/Users/01_Open Image Data Set/01_Raw Data/flickrexport_cars_oid_201903.csv",sep=",", encoding = "Latin-1", header=TRUE)
  

После импорта данных набор имеет следующую структуру:

 Classes ‘data.table’ and 'data.frame':  820600 obs. of  2180 variables:
 $ count_comments                          : int  0 0 0 0 0 2 2 0 0 1 ...
 $ count_faves                             : int  5 2 2 15 1 3 19 5 1 4 ...
 $ dateadded                               : int  1530174689 1530174688 1530174687 1530162494 1530159458 1530158648 1530158074 1529994404 1529992211 1529868922 ...
 $ datetaken                               : chr  "2018-05-10 15:50:59" "2018-05-10 15:50:53" "2018-05-10 15:50:03" "2006-11-27 00:00:00" ...
 $ dateupload                              : int  1530174672 1530174671 1530174669 1498275521 1436228321 1482723483 1496706006 1529994381 1529992197 1529868901 ...
 $ group_url                               : chr  "https://www.flickr.com/groups/capriceclassic/" "https://www.flickr.com/groups/capriceclassic/" "https://www.flickr.com/groups/capriceclassic/" "https://www.flickr.com/groups/capriceclassic/" ...
 $ id                                      :integer64 42341316794 42341318944 42341324184 35456820766 19292939750 31070311463 34738418140 42964602432 ... 
 $ license                                 : int  6 6 6 0 0 0 0 6 0 6 ...
 $ oid.800metres                           : logi  NA NA NA NA NA NA ...
 $ oid.Abbey                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Abdomen                             : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Academicconference                  : logi  NA NA NA NA NA NA ...
 $ oid.Academicdress                       : logi  NA NA NA NA NA NA ...
 $ oid.Accipitriformes                     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Acousticguitar                      : logi  NA NA NA NA NA NA ...
 $ oid.Acoustic-electricguitar             : logi  NA NA NA NA NA NA ...
 $ oid.Acrylicpaint                        : logi  NA NA NA NA NA NA ...
 $ oid.Actionfigure                        : logi  NA NA NA NA NA NA ...
 $ oid.Adolescent                          : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Adult                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Adventure                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Advertising                         : num  NA NA NA NA NA ...
 $ oid.Aeolianlandform                     : logi  NA NA NA NA NA NA ...
 $ oid.Aerialphotography                   : logi  NA NA NA NA NA NA ...
 $ oid.Aerobatics                          : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Aerospaceengineering                : logi  NA NA NA NA NA NA ...
 $ oid.Africanelephant                     : logi  NA NA NA NA NA NA ...
 $ oid.Afterglow                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Agaric                              : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Agaricaceae                         : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Agaricus                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Agriculturalmachinery               : logi  NA NA NA NA NA NA ...
 $ oid.Agriculture                         : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Airforce                            : logi  NA NA NA NA NA NA ...
 $ oid.Airracing                           : logi  NA NA NA NA NA NA ...
 $ oid.Airshow                             : logi  NA NA NA NA NA NA ...
 $ oid.Airsports                           : logi  NA NA NA NA NA NA ...
 $ oid.Airtravel                           : logi  NA NA NA NA NA NA ...
 $ oid.Airbusa320family                    : logi  NA NA NA NA NA NA ...
 $ oid.Aircraft                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Aircraftcabin                       : logi  NA NA NA NA NA NA ...
 $ oid.Aircraftcarrier                     : logi  NA NA NA NA NA NA ...
 $ oid.Aircraftengine                      : logi  NA NA NA NA NA NA ...
 $ oid.Airline                             : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Airliner                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Airplane                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Airport                             : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Airportapron                        : logi  NA NA NA NA NA NA ...
 $ oid.Airportterminal                     : logi  NA NA NA NA NA NA ...
 $ oid.Aisle                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Albumcover                          : logi  NA NA NA NA NA NA ...
 $ oid.Alcohol                             : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Alcoholicbeverage                   : logi  NA NA NA NA NA NA ...
 $ oid.Ale                                 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Algae                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Alley                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Alligator                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Alloywheel                          : logi  NA NA NA NA NA NA ...
 $ oid.All-terrainvehicle                  : logi  NA NA NA NA NA NA ...
 $ oid.Alps                                : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Altar                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Amateurboxing                       : logi  NA NA NA NA NA NA ...
 $ oid.Amateurwrestling                    : logi  NA NA NA NA NA NA ...
 $ oid.Ambulance                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Americanfootball                    : logi  NA NA NA NA NA NA ...
 $ oid.Amphibian                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Amphibiousassaultship               : logi  NA NA NA NA NA NA ...
 $ oid.Amphibioustransportdock             : logi  NA NA NA NA NA NA ...
 $ oid.Amphitheatre                        : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Amusementpark                       : logi  NA NA NA NA NA NA ...
 $ oid.Amusementride                       : logi  NA NA NA NA NA NA ...
 $ oid.Ancientgreektemple                  : logi  NA NA NA NA NA NA ...
 $ oid.Ancienthistory                      : logi  NA NA NA NA NA NA ...
 $ oid.Ancientromanarchitecture            : logi  NA NA NA NA NA NA ...
 $ oid.Ancientrome                         : logi  NA NA NA NA NA NA ...
 $ oid.Animal                              : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Animalmigration                     : logi  NA NA NA NA NA NA ...
 $ oid.Animalshelter                       : logi  NA NA NA NA NA NA ...
 $ oid.Animalsports                        : logi  NA NA NA NA NA NA ...
 $ oid.Animaltraining                      : logi  NA NA NA NA NA NA ...
 $ oid.Anime                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Annualplant                         : logi  NA NA NA NA NA NA ...
 $ oid.Ant                                 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Antelope                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Antique                             : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Antiquecar                          : logi  NA NA NA NA NA NA ...
 $ oid.Apartment                           : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Ape                                 : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Apple                               : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Aqua                                : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Aquarium                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Aquaticplant                        : logi  NA NA NA NA NA NA ...
 $ oid.Aqueduct                            : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Arabiancamel                        : logi  NA NA NA NA NA NA ...
 $ oid.Arcade                              : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Arch                                : num  NA NA NA NA NA NA NA NA NA NA ...
 $ oid.Archbridge                          : logi  NA NA NA NA NA NA ...
 $ oid.Archaeologicalsite                  : logi  NA NA NA NA NA NA ...
 $ oid.Archipelago                         : num  NA NA NA NA NA NA NA NA NA NA ...
  [list output truncated]
 - attr(*, ".internal.selfref")=<externalptr> 
  

Проблема в том, что fread каким-то образом неправильно интерпретирует некоторые столбцы «oid.XXXX». Все они должны иметь тип «num». Однако я не могу просто изменить соответствующие столбцы на «num» после импорта данных, поскольку это оставило бы меня с «FALSE, 0 или 1» вместо числовых значений.

Поэтому я пытаюсь присвоить определенный colClass всем столбцам «oid.XXX» в самой функции fread(). Это то, что я придумал до сих пор:

 flickrcar <- fread("/Users/01_Open Image Data Set/01_Raw Data/flickrexport_cars_oid_201903.csv", colClasses=list(numerical=grep("oid.", names(flickrcar), value = TRUE)),sep=",", encoding = "Latin-1", header=TRUE)
  

К сожалению, это не работает. Заранее большое спасибо за вашу помощь!

Комментарии:

1. что вы имеете в виду, говоря «это оставило бы меня с «FALSE, 0 или 1″»?. Если вы это сделаете as.numeric(c(NA, FALSE, TRUE)) , вы получите NA, 0, 1

2. Да, я прошу прощения, конечно, я имею в виду NA, 0, 1. Но я ищу числовые значения вероятности.

Ответ №1:

Вы могли бы сначала прочитать только заголовок, чтобы найти, какие столбцы имеют oid в своем названии. Затем установите классы соответствующим образом:

 x = fread('
A B C oid.a oid.b D E
1 2 3 NA     NA     6 7',
  nrows = 0)

colNames = grep('^oid', names(x), value = TRUE)
colClasses = rep('numeric', length(colNames))
names(colClasses) = colNames 
x = fread('
A B C oid.a oid.b D E
1 2 3 NA    NA     6 7',
  colClasses = colClasses)
str(x)
# Classes ‘data.table’ and 'data.frame':    1 obs. of  7 variables:
# $ A    : int 1
# $ B    : int 2
# $ C    : int 3
# $ oid.a: num NA
# $ oid.b: num NA
# $ D    : int 6
# $ E    : int 7
  

Альтернативой, конечно, было бы переделать столбцы после их чтения, но для больших данных правильная настройка класса сначала, как показано, вероятно, была бы предпочтительнее

Комментарии:

1. совершенное спасибо вам большое! Это именно то, что я искал.