如何在R中读取此类数据

时间:2015-09-21 16:04:08

标签: r import

我正在尝试将此文本数据导入R:

+1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 -1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 -1 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1

哪个是

<label> <feature>:<value> <feature>:<value>...

数据仅存储那些非零的特征。因此,第一个观察是Y = 1,第4个10月18日... X的第83个特征是1.

我试图将这些标签存储在一个向量中,并将值存储在矩阵中。 扫描或read.table似乎不适用于此。所以我需要一些帮助来指出任何可能的方法。

2 个答案:

答案 0 :(得分:1)

另一种方法。

txt   <- "+1 4:1 10:1 18:1 22:1 36:1 40:1 59:1 63:1 67:1 73:1 74:1 76:1 80:1 83:1 -1 3:1 6:1 17:1 29:1 39:1 40:1 52:1 63:1 67:1 73:1 74:1 76:1 82:1 83:1 -1 2:1 6:1 14:1 19:1 39:1 42:1 52:1 64:1 68:1 72:1 74:1 76:1 80:1 98:1"
txt   <- gsub("(\\-1|\\+1])","\n\\1",txt)
lines <- readLines(textConnection(txt))
parse.line <- function(line) {
  lst <- strsplit(line, " ")[[1]]
  mat <- do.call(rbind,lapply(lst[-1],function(x)strsplit(as.character(x),split=":")[[1]]))
  data.frame(label=lst[1],mat)
}
result <- do.call(rbind, lapply(lines,parse.line))

所以这需要你的字符串(txt)并在每个+/- 1的实例之前嵌入CR,然后使用readLines(...)读取结果。然后我们使用parse.line(...)将每一行解析为一个特征/值对矩阵和一个标签(+/- 1),并将它们组合成一个data.frame。最后一行将data.frames逐行绑定在一起。

这可能与其他答案类似,但我不太确定。

答案 1 :(得分:0)

假设您将数据放在名为test.txt的单行txt文件中。您可以将其作为字符串加载到R中:

library(dplyr)
library(tidyr)
file = "~/Desktop/test.txt"
read_line = readChar(file, nchars = file.info(file)$size)

从您发布的内容中看,它是空格分隔的,所以你可以这样做:

space_separated = strsplit(read_line, " ", fixed = TRUE)[[1]]

看起来标签是不包含字符':'的标签,因此您可以通过以下方式识别其位置:

find_labels = which(!grepl("\\:", space_separated)) 

现在最棘手的一点就是以有效的方式分割角色,你可以像这样实现它:

all_res = lapply(seq_along(find_labels), function(i){
  # Create indexes that identify one label
  if(i == length(find_labels))
    label_subset = seq(find_labels[i], length(space_separated))
  else
    label_subset = seq(find_labels[i], find_labels[i + 1] - 1)
  # Name of the label
  the_label = space_separated[label_subset[1]]
  # Value
  the_subset = space_separated[label_subset[-1]]
  data_frame(label = the_label, value = the_subset)
})

这将返回一个可以绑定的数据框列表:

all_res = rbind_all(all_res) %>% 
 separate(value, c("feature", "value"))

因此输出将是一个如下所示的数据框:

label | feature | value
  +1  |   4     |   1
  +1  |   10    |   1     
  +1  |   18    |   1
        .......