文本文件到带有列表列的数据框

时间:2016-08-02 05:14:03

标签: r list dataframe dplyr

我正在尝试读取这样的文本文件:

exp1 sample1 2 5  
exp2 sample1 2 3 5 7
exp1 sample2 1 2 6

到具有列表列的数据框,如下所示:

tibble(exp = c("exp1", "exp2", "exp3"), 
       sample = c("sample1","sample1","sample2"), 
       listdata = list(list(2,5), list(2,3,5,7), list(1,2,6)))

# A tibble: 3 x 3
    exp  sample   listdata
  <chr>   <chr>     <list>
1  exp1 sample1 <list [2]>
2  exp2 sample1 <list [4]>
3  exp3 sample2 <list [3]>

目的是使用前两列中的元数据来选择和操作列表。

我可以将这些内容列为列表,但不知道如何分隔元数据:

listdata <- read_lines("list_c_data.txt") %>% strsplit(., " ") %>% tibble()

有什么建议吗?我可能需要逐行读取文件,因为观察的数量可能> 100000并且每行中列表的长度可能> 1000

1 个答案:

答案 0 :(得分:2)

我们使用read.table/read.csv使用fill = TRUE,然后gather(来自tidyr)数据集的第3列到最后一列来阅读文件,以将其重新整理为“长”格式,按'V1'和'V2'分组,我们summarise将'Val'作为list,然后根据需要rename列。

library(dplyr)
library(tidyr)
df1 <- read.table("yourfile.txt", header=FALSE, fill = TRUE)
gather(df1, Var, Val, V3:ncol(df1), na.rm = TRUE) %>%
         group_by(V1, V2) %>% 
         summarise(Val = list(Val)) %>%
         rename(exp=V1, sample = V2, listdata = Val)             

或者我们可以scan按空格读取行strsplit,将'lst'中的元素(过滤掉第1和第2个)转换为numeric,同时我们{{1}第一和第二个元素到rbind并创建'lst2'作为第三列。

data.frame