文本文件到带有列表列的dataframe

文本文件到带有列表列的dataframe,r,list,dataframe,dplyr,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

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

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]>
到具有如下列表列的数据帧:

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

我们使用fill=TRUE的read.table/read.csv读取文件,然后从tidyr收集数据集的第三列到最后一列,将其重塑为“long”格式,按“V1”和“V2”分组,我们将“Val”总结为一个列表,然后根据需要重命名列

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)             
我们使用fill=TRUE的read.table/read.csv读取文件,然后从数据集的第三列到最后一列收集数据,将其重新格式化为“long”格式,按“V1”和“V2”分组,我们将“Val”汇总为列表,然后根据需要重命名这些列

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)             

非常感谢。两个都试过了。第一种方法对我来说更容易理解,但是read.table似乎不能很好地处理不同的列表长度-它截断较长的列表,并开始一个新行。我猜它使用前几行来确定要填充的最大列数。你的第二种方法很有效。只是我不熟悉基函数-它们看起来不像我能记住的东西/掌握:-@Dong我尝试了你的示例,使用fill=TRUE,并能够获得预期的输出。是的,它适用于示例,但如果列表长度为2、4、3、4、9、3,它将失败。列表长度为9的行将折叠到下一行。我认为read.table使用的是一种算法来确定列数,而不必到达文件的末尾。第二种方法的一个缺点是lst大小比原始文件大小大10倍。一旦文件变大,它可能会成为一个问题。@Dong在fread from data.table中有fill选项,应该是fast谢谢。两个都试过了。第一种方法对我来说更容易理解,但是read.table似乎不能很好地处理不同的列表长度-它截断较长的列表,并开始一个新行。我猜它使用前几行来确定要填充的最大列数。你的第二种方法很有效。只是我不熟悉基函数-它们看起来不像我能记住的东西/掌握:-@Dong我尝试了你的示例,使用fill=TRUE,并能够获得预期的输出。是的,它适用于示例,但如果列表长度为2、4、3、4、9、3,它将失败。列表长度为9的行将折叠到下一行。我认为read.table使用的是一种算法来确定列数,而不必到达文件的末尾。第二种方法的一个缺点是lst大小比原始文件大小大10倍。一旦文件变大,它可能会成为一个问题。@Dong在fread from data.table中有fill选项,它应该很快