取消装箱列表作为数据框列优雅地列出

时间:2013-08-16 07:34:32

标签: r

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

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"))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')