文本文件到带有列表列的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选项,它应该很快