【发布时间】:2013-11-30 20:12:12
【问题描述】:
我试图在df2 中找到与df1 中的value 百分比范围内的values。这些dfs 是长格式,由以下列/变量State (df1)、ID(df2)、MM、variable 和value 组成。我匹配MM 和variable 并在data.frames 之间包含所有values,以便我可以稍后将它们子集以选择百分比内的那些。
我的问题的解决方案几乎可以找到here,使用合并然后子集找到values。但是,额外的细微差别不允许我按原样使用此解决方案。 df1 是 ~900 行,df2 是 ~1,600,000 行,如果我尝试 merge all,r/我的机器无法处理它。但是,首先将每个data.frame 子集MM 和variable 然后合并,然后子集,最后绑定所有中介子集data.frames 应该产生我想要的结果。
有没有办法对data.frames 然后merge 进行子集化,将结果存储到通过子集化data.frames 的列表合并然后重新绑定它们?
我知道 dlply 可以制作子集 data.frames 的列表,但我不知道是否应该使用然后将列表创建回 data.frames 以进行合并。另外,我不知道如何保持子集和合并的顺序。最多有 12 个 MM 组,始终有 4 个 variable 组,每个 df 最多 36 个子集。
for 循环或带有 for 循环的函数似乎可以工作,但我不知道 r 中的正确工具可以做到这一点。
下面的示例为一个(最多 36 个)MM 和 variable 分组执行子集和合并。
# for example, MM = 1 and variable = TMN
df1 <- structure(list(State = structure(c(1L, 1L, 3L, 3L, 2L, 2L, 1L,
1L, 3L, 3L, 2L, 2L), .Label = c("AL", "NM", "PA"), class = "factor"),
MM = c(1L, 1L, 2L, 3L, 5L, 6L, 1L, 1L, 2L, 3L, 5L, 6L), variable = structure(c(2L,
4L, 2L, 4L, 2L, 4L, 3L, 1L, 3L, 1L, 3L, 1L), .Label = c("RH",
"TMN", "TMP", "TMX"), class = "factor"), value = c(1.2, 2.3,
3.4, 5.6, 7.8, 9.1, 1.3, 2.4, 3.5, 4.6, 5.7, 6.8)), .Names = c("State",
"MM", "variable", "value"), class = "data.frame", row.names = c(NA,
-12L))
df2 <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 3L, 4L, 4L, 4L), MM = c(1L, 1L, 1L, 1L, 2L, 6L, 3L, 2L, 5L, 6L, 6L, 5L, 3L, 1L, 7L
), variable = structure(c(2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L,
4L, 1L, 3L, 1L, 2L, 4L), .Label = c("RH", "TMN", "TMP", "TMX"), class = "factor"),
value = c(1.2, 2.3, 2.4, 1.3, 3.4, 9.1, 4.7, 3.5, 7.8, 5.6,
6.9, 5.7, 8.5, 1.2, 4.5)), .Names = c("ID", "MM", "variable", "value"),
class = "data.frame", row.names = c(NA, -15L))
df1.tmn <- subset(df1, MM == 1 && variable == 'TMN')
df2.tmn <- subset(df2, MM == 1 & variable == 'TMN')
df1.df2.tmn <- merge(df1.tmn, df2.tmn, by = c("MM", "variable"))
# desired output example using one MM and one variable
df1.df2.tmn.sub <- subset(df1.df2.tmn, value.y < value.x*1.025 & value.y > (value.x-(value.x*.025)))
# dlply can make subsets from data.frames into a list, but
MM <- unique(as.list(df1$MM))
VAR <- unique(as.list(df1$variable))
dlply(df1, c("MM", "variable"))
【问题讨论】:
标签: r loops merge dataframe subset