【问题标题】:Subset data.frames, merge subsets, and rbind for result子集 data.frames、合并子集和 rbind 以获取结果
【发布时间】:2013-11-30 20:12:12
【问题描述】:

我试图在df2 中找到与df1 中的value 百分比范围内的values。这些dfs 是长格式,由以下列/变量State (df1)、ID(df2)、MMvariablevalue 组成。我匹配MMvariable 并在data.frames 之间包含所有values,以便我可以稍后将它们子集以选择百分比内的那些。

我的问题的解决方案几乎可以找到here,使用合并然后子集找到values。但是,额外的细微差别不允许我按原样使用此解决方案。 df1 是 ~900 行,df2 是 ~1,600,000 行,如果我尝试 merge all,r/我的机器无法处理它。但是,首先将每个data.frame 子集MMvariable 然后合并,然后子集,最后绑定所有中介子集data.frames 应该产生我想要的结果。

有没有办法对data.frames 然后merge 进行子集化,将结果存储到通过子集化data.frames 的列表合并然后重新绑定它们?

我知道 dlply 可以制作子集 data.frames 的列表,但我不知道是否应该使用然后将列表创建回 data.frames 以进行合并。另外,我不知道如何保持子集和合并的顺序。最多有 12 个 MM 组,始终有 4 个 variable 组,每个 df 最多 36 个子集。

for 循环或带有 for 循环的函数似乎可以工作,但我不知道 r 中的正确工具可以做到这一点。

下面的示例为一个(最多 36 个)MMvariable 分组执行子集和合并。

# 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


    【解决方案1】:

    从你问题的这一部分:

    有没有办法对 data.frames 进行子集化,然后合并它们,存储结果 直到通过子集data.frames列表合并然后rbind 他们?

    我假设您想保留中间结果或中间计算/子集。如果确实如此,您可以将中间结果存储在一个文件中(例如 .txt 或 .csv 文件),然后在必要时读取该文件。

    你可以写一个data.frame,比如my_df,直接写成这样的文件:

    write.table(my_df,"filename.txt", sep="\t")
    

    此处,data.frame 的列由制表符分隔,但请查看此 I/O 命令上的documentation 了解更多详细信息。

    当您想将所有信息加载到 data.frame 中时,只需使用read.table 命令:

    newDf <- read.table("filename.txt")
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多