我正在尝试读取这样的文本文件:
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
答案 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