0

我有一个数据框,其中包含一个带有常规部分的文件名。我使用正则表达式来解析这个文件名并将每个部分存储在它自己的列中。

parse.file.name <- function(file.name="cc-nolabel-AEMNZ334_0009-loc-1317-407-6-39.png")
{

rfn <- regexec(pattern="cc-(.+?)-(.+?)-loc-(.+?)-(.+?)-(.+?)-(.+?)\\.png", text=file.name)
matchfn <- regmatches(file.name, rfn)
return(matchfn)
}

basic.features$parsed.filename <- parse.file.name(as.character(basic.features$filename))

filename包含类似于默认参数的值。我正在检索每列的各个值,如下所示:

 basic.features$label <- unlist(lapply(basic.features$parsed.filename,
                                      function(pf) {
                                         return(unlist(pf)[2]) } ))

我觉得这不是一种优雅的方式,但无法轻松地从包含每行列表的数据框列中获取单个值。有一个更好的方法吗?

如果您喜欢示例数据:

basic.features <- data.frame(filename=c("cc-nolabel-AEMNZ336_0009-loc-1003-1504-7-8.png", "cc-nolabel-AEMNZ335_0006-loc-1979-880-13-10.png", "cc-nolabel-AEMNZ333_0007-loc-941-263-8-8.png", "cc-nolabel-AEMNZ336_0014-loc-2011-24-4-4.png", "cc-nolabel-AEMNZ335_0013-loc-2087-644-66-41.png", "cc-nolabel-AEMNZ333_0013-loc-1531-374-12-23.png"))
4

2 回答 2

2

如果您使用它会更简单sapply

basic.features$label <- sapply(basic.features$parsed.filename,function(x){x[2]})

但是,如果您想一次性将解析的值转换为 data.frame,您可以这样做:

DF <- data.frame(t(sapply(basic.features$parsed.filename,function(x){x})))
colnames(DF) <- c('filename','label','code1','code2','code3','code4','code5')

> DF
                                         filename   label         code1 code2 code3 code4 code5
1  cc-nolabel-AEMNZ336_0009-loc-1003-1504-7-8.png nolabel AEMNZ336_0009  1003  1504     7     8
2 cc-nolabel-AEMNZ335_0006-loc-1979-880-13-10.png nolabel AEMNZ335_0006  1979   880    13    10
3    cc-nolabel-AEMNZ333_0007-loc-941-263-8-8.png nolabel AEMNZ333_0007   941   263     8     8
4    cc-nolabel-AEMNZ336_0014-loc-2011-24-4-4.png nolabel AEMNZ336_0014  2011    24     4     4
5 cc-nolabel-AEMNZ335_0013-loc-2087-644-66-41.png nolabel AEMNZ335_0013  2087   644    66    41
6 cc-nolabel-AEMNZ333_0013-loc-1531-374-12-23.png nolabel AEMNZ333_0013  1531   374    12    23
于 2013-08-16T09:13:19.940 回答
1

我建议分三步进行。

  1. 通过对它们进行行绑定,将向量列表转换为矩阵:

    mat <- do.call(rbind, basic.features$parsed.filename)
    
  2. 接下来,转换为数据框

    df <- as.data.frame(mat, stringsAsFactors = FALSE)
    
  3. 最后,将字符转换为正确类型的列和名称列

    df[] <- lapply(df, type.convert, as.is = TRUE)
    names(df) <- c('filename', 'label', 'code1', 'code2', 'code3', 'code4', 'code5')
    
于 2013-08-16T13:16:37.110 回答