【问题标题】:Carry out statistical analyses across several, uneven, data.frame objects with R使用 R 对多个不均匀的 data.frame 对象进行统计分析
【发布时间】:2021-12-09 22:02:25
【问题描述】:

我不确定这是问这种问题的正确地方,但这里是……

我想对我在 R 中的数据进行统计分析。但是,这些数据分散在几个不同大小的 data.frame (df) 对象中。

所有df 对象具有相同的结构,例如:

        Date PDD.Open PDD.High PDD.Low PDD.Close PDD.Volume PDD.Adjusted
1 2018-07-26    26.50    27.45   25.00     26.70   43213200        26.70
2 2018-07-27    27.54    27.54   23.21     24.60   19923300        24.60
3 2018-07-30    23.31    23.90   21.88     22.50   13967700        22.50
4 2018-07-31    22.20    22.71   19.62     22.59   13709600        22.59
5 2018-08-01    19.38    21.40   18.62     20.31   19339000        20.31
6 2018-08-02    19.27    20.18   19.03     19.66    9268500        19.66

例如,截至今天 (2021.10.23),MPNGF 有 734 个观测值,NKLA 有 850 个,PDD 有 818 个,RMO 648 个。

当我尝试将PDD$PDD.OpenRMO$RMO.Open 相关联时,我得到一个Error in cor(PDD$PDD.Open, RMO$RMO.Open) : incompatible dimensions

下面是一个希望可重现的代码示例来说明问题:

library(quantmod)

# Load various ticker data
tickers <- c("NKLA", "MPNGF", "PDD", "RMO")
getSymbols.yahoo(tickers, auto.assign = TRUE, env = globalenv(), 
                 from = "2000-01-01")

# Close all Internet connections as a precaution
# https://stackoverflow.com/a/52758758/2950721
closeAllConnections()

# Find xts objects
xtsObjects <- names(which(unlist(eapply(.GlobalEnv, is.xts))))

# Convert xts to data.frame
# https://stackoverflow.com/a/69246047/2950721
for (i in seq_along(xtsObjects)) {
  assign(xtsObjects[i], fortify.zoo(get(xtsObjects[i])))
}

# Change name of 1st column to Date of converted xts objects
# https://stackoverflow.com/a/69292036/2950721
for (i in seq_along(xtsObjects)) {
  tmp <- get(xtsObjects[i])
  colnames(tmp)[colnames(tmp) == "Index"] <- "Date"
  assign(xtsObjects[i], tmp)
}
remove(i, tickers, tmp, xtsObjects)


> cor(PDD$PDD.Open, RMO$RMO.Open)
Error in cor(PDD$PDD.Open, RMO$RMO.Open) : incompatible dimensions

其他重要细节:

  • df 对象的数量增加(即定期添加新代码/符号并下载其数据)。
  • 现有的 df 对象会定期(有时​​每天)更新(即,添加到每个下载的代码的最后值)。

我的问题:

  • 考虑到上述情况,应该如何“处理”数据(因为没有更好的术语),以便可以使用它进行任何类型的统计分析(包括超过 2 个df 对象)?
  • 是否应该合并数据?
  • 有最佳做法吗?
  • 应该使用什么代码来进行合并(记住它需要更新)?

提前致谢。


使用的系统:

  • R 版本:4.1.1 (2021-08-10)
  • RStudio 版本:1.4.1717
  • 操作系统:macOS Catalina 版本 10.15.7 和 macOS Big Sur 版本 11.6

【问题讨论】:

    标签: r dataframe data-manipulation


    【解决方案1】:

    您可以计算匹配日期的相关性。

    dis <- as.Date(intersect(PDD$Date, RMO$Date), origin='1970-01-01')
    cat('Nobs used\nPDD: ', length(dis)*100/nrow(PDD), 
        '%, RMO: ', length(dis)*100/nrow(RMO), '%', sep='')
    # Nobs used
    # PDD: 79.2176%, RMO: 100%
    cor(PDD[PDD$Date %in% dis, 'PDD.Open'], RMO[RMO$Date %in% dis, 'RMO.Open'])
    # [1] 0.4150031
    

    如果您rbind 数据框,您需要唯一的名称,并且可能需要添加一个标识观察的列。

    L <- mget(c("MPNGF", "NKLA", "PDD", "RMO"))  ## list data.frames
    L <- Map(`[<-`, L, 'Name', value=names(L))  ## add 'Name' column
    ## set unique names
    L <- lapply(L, setNames, gsub('.*(?>\\.)', '', names(L[[1]]), perl=TRUE))
    DF <- `rownames<-`(do.call(rbind, L), NULL)  ## rbind
    
    head(DF)
    #         Date Open High Low Close Volume Adjusted  Name
    # 1 2018-11-23  7.0  7.0 7.0   7.0    100      7.0 MPNGF
    # 2 2018-11-26  7.0  7.0 7.0   7.0      0      7.0 MPNGF
    # 3 2018-11-27  7.0  7.0 7.0   7.0      0      7.0 MPNGF
    # 4 2018-11-28  7.0  7.0 7.0   7.0      0      7.0 MPNGF
    # 5 2018-11-29  6.5  6.5 6.5   6.5    100      6.5 MPNGF
    # 6 2018-11-30  6.5  6.5 6.5   6.5      0      6.5 MPNGF
    

    【讨论】:

    • 感谢您的回答 jay.sf。除了Date 列,每一列都已经被唯一标识(您可以查看我在问题中发布的结构示例)。您认为Date 列也应该唯一标识吗?如果没有,如何rbinddata.frame 对象与data.frame 对象具有最旧的日期?如果在更晚的阶段加载一个带有更早日期的新代码怎么办,它可以优先吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 2019-09-16
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多