grep или pmatch? - PullRequest
       7

grep или pmatch?

1 голос
/ 17 октября 2011

Я пытаюсь импортировать серию файлов из каталога и преобразовать каждый из них в кадр данных.Я также хотел бы использовать заголовок файла для создания двух новых столбцов со значениями, зависящими от заголовка.Входные файлы имеют формат: xx_yy.out Где XX может принимать одно из трех значений.YY в настоящее время имеет два возможных значения.В будущем эти цифры будут расти.


Редактирование решения на основе комментариев (оригинальный вопрос см. Ниже)


отредактировано еще раз, чтобы отразить предложения @JoshO'Brien

filelist <- as.list(dir(pattern = ".*.out"))

for(i in filelist) {

    tempdata  <- read.table(i)                  #read the table
    filelistshort <- gsub(".out$", "", i)       #remove the end of the file
    tempsplit <- strsplit(filelistshort, "_")   #remove the underscore
    xx <- sapply(tempsplit, "[", 1)             #get xx
    yy <- sapply(tempsplit, "[", 2)             #get yy
    tempdata$XX <- xx                           #add XX column
    tempdata$YY <- yy                           #add YY column
    assign(gsub(".out","",i), tempdata)         # give the dataframe a shortened name

}

Ниже приведен оригинальный код, показывающий, что я хотел использовать некоторые средства для получения значений XX и YY, но не был уверен в лучшем способе:

Мой план (после @romanlustrik post ) выглядит следующим образом:

filelist <- as.list(dir(pattern = ".*.out"))
lapply(filelist, FUN = function(x) {
    xx <- grep() or pmatch()
    yy <- grep() or pmatch()
    x <- data.frame(read.table(x)) 
    x$colx <- xx
    x$coly <- yy
    return(x)
})

где строки xx <- и yy <- будут поиском на основе pmatch или grep.Я играю вокруг, чтобы сделать одну из работ, но приветствую любые предложения.

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Если мы можем предположить, что имена ваших файлов будут содержать только один "_", я бы вообще не использовал grep() или pmatch().

strsplit(), кажется, обеспечивает более чистое иболее простое решение:

filelist <- c("aa_mm.out", "bb_mm.out", "cc_nn.out")

# Remove the trailing ".out"
rootNames <- gsub(".out$", "", filelist)

# Split string at the "_"
rootParts <- strsplit(rootNames, "_")

# Extract the first and second parts into character vectors
xx <- sapply(rootParts, "[", 1)
yy <- sapply(rootParts, "[", 2)

xx
# [1] "aa" "bb" "cc"
yy
# [1] "mm" "mm" "nn"
0 голосов
/ 17 октября 2011

Это безобразный хак, но он выполняет свою работу.

fl <- c("12_34.out", "ab_23.out", "02_rk.out")
xx <- regexpr(pattern = ".._", text = fl)
XX <- (substr(fl, start = xx, stop = xx + attr(xx, "match.length")-1))
  [1] "12" "ab" "02"
yy <- regexpr(pattern = "_..", text = fl)
YY <- (substr(fl, start = yy + 1, stop = yy + attr(yy, "match.length")-1))
  [1] "34" "23" "rk"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...