我有一个数据框,其中包含带有常规部件的文件名。我使用正则表达式来解析此文件名并将每个部分存储在自己的列中。
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"))
答案 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)
我建议分三步完成。
通过行绑定将矢量列表转换为矩阵:
mat <- do.call(rbind, basic.features$parsed.filename)
接下来,转换为数据框
df <- as.data.frame(mat, stringsAsFactors = FALSE)
最后,将字符转换为正确类型和名称列的列
df[] <- lapply(df, type.convert, as.is = TRUE)
names(df) <- c('filename', 'label', 'code1', 'code2', 'code3', 'code4', 'code5')