【发布时间】:2016-08-03 20:28:48
【问题描述】:
我有很多文件,我正在尝试找到读取数据框并在一列中查找常见值的最有效方法。
现在我有: 1. 我使用以下方式读取文件列表:
files = c("test1.txt", "test2.txt", test3.txt")
my.data <- lapply(files, read.table, header=T)
每个包含列,例如
df1 = data.frame(id=c("a", "b", "c"), v = c(1:3), c=c(10:12))
df2 = data.frame(id=c("x", "b", "c"), v = c(2:4), c=c(13:15))
df3 = data.frame(id=c("a", "n", "c"), v = c(4:6), c=c(16:18))
my.data = list(df1, df2, df3)
现在我正在尝试对数据框列表进行子集化,以返回相同的数据框列表,每个数据框仅包含名为“id”的第一列的公共行,例如
df1, df2, and df3 in this case would be a list containing only "id" common to all read files, i.e. a row with only "c" in this case:
intersect(intersect(df1$id, df2$id), df3$id);
list(df1[3,], df2[3,], df3[3,])
但我想不出一种使用列表来合并所有数据帧的方法,也许这是一个比读取所有文件更长/更困难的过程,首先通过公共列“id”将它们全部合并,然后拆分它们进入数据框列表?有人对最有效的方法有任何见解吗?谢谢!
【问题讨论】:
-
Reduce(intersect, Map("[[", my.data, "id"))。但它不是一个列表,只是所有 id 共有的交集。 -
嗨,理查德,谢谢。这将给出常见的“id”,但我正在尝试返回具有这些常见 id 的数据帧列表...
-
你的意思是喜欢
lapply(my.data, function(x) x[x$id %in% Reduce(intersect, Map("[[", my.data, "id")), ])吗? -
是的,完全正确!这只是一种疯狂的方式吗?做一个“read.table”会更好,然后“合并”所有数据帧,然后用“拆分”将所有数据帧拆分成一个列表...
-
你并没有真正分裂任何东西。您正在对行进行子集化。