【问题标题】:Time series: What's the most efficient way to write code for subsets?时间序列:为子集编写代码的最有效方法是什么?
【发布时间】:2017-09-01 11:23:25
【问题描述】:

我有两个数据框

df1

time x   y   state
...  ... ... CA
...  ... ... MA
...  ... ... TX
...  ... ... MA
...  ... ... CA
...  ... ... IL

df2

time x   y   state
...  ... ... MA
...  ... ... NY
...  ... ... MA
...  ... ... TX
...  ... ... CA
...  ... ... CA

然后我有一些代码,我在其中汇总每月值、重命名列、将数据与另一个列表匹配,然后将 df1 和 df2 合并为大约 50 行代码中的一个。在这里,我目前不考虑state

但是,我需要为美国的几个州创建合并数据框的子集。除了复制/粘贴用于 df1 和 df2 的代码并将 df1 和 df2 替换为 df1_CA、df2_MA 等之外,还有更优雅的方法吗?

循环?面板数据?

【问题讨论】:

  • 有一个look at split`,然后是lapply函数(或循环)。 split(df1,df1$state)
  • dplyr 中使用group_by 可能适合这里
  • 如果您能提供一个可重现的小例子,那就太好了。很抱歉,我无法提供我的原始代码。
  • @Fanny,实际上,你的工作是提供一个小的可重现示例。

标签: r dataframe subset


【解决方案1】:

一种选择是使用 data.table 包进行分组分析。

# transform your data.frame to data.table
dt1 <- as.data.table(df1)
dt2 <- as.data.table(df2)

# e.g. grouping values on state level
dt1[, sum(y), by=state]
# this will accumulate all y values by state

如果您不想替换代码中的 df 名称,您可以定义一个函数:

# define the function
accumulate <- function(df){
  dt <- as.data.table(df)
  return(dt[, sum(y), by=state])
}

# and call it 
accumulate(df1)
accumulate(df2)

您可以在所有 data.frames 上使用一个可有效迭代数据结构的应用函数之一,而不是使用 for 循环或类似函数,例如列表

# alternatively define a list of data.frames and then iterate over the list
my.dfs <- list(df1,df2)
lapply(my.dfs, accumulate(df))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多