【问题标题】:How to use 'group_by()' in R to make sure columns are of equal length?如何在 R 中使用“group_by()”来确保列的长度相等?
【发布时间】:2020-10-28 04:54:33
【问题描述】:
  1. 我有一个包含 3 列股票市场数据的数据框:1-Date、2-Price、3-Symbol

  2. 符号列是不同的股票代码。

  3. 我正在尝试获取任何给定两个或多个 Symbol 在任何给定时间范围内的 价格 比率。

  4. 但是,并非所有符号的数据都可以追溯到其他符号,所以...

  5. 我可以使用 group_by(Data) 之类的方法,然后删除任何未分组的行吗?

这里,allTickerData 是主要数据框,我根据用户选择的股票代码作为我们比率的分母对其进行过滤。

DenominatedTicker <- allTickerData %>% dplyr::filter(., symbol == input$DenomTickerChoice)

然后我们在主数据框中创建一个新列,RatioPrice,它将每个代码的价格除以用户选择的分母。

但是,我只尝试在日期匹配的情况下执行此操作,并且希望删除任何未分组的日期(日期已经排序)。

UserTickerChoices 是用户选择的代码列表。

activeTickerDataByDate <- allTickerData %>% dplyr::filter(., symbol == input$UserTickerChoices) %>% group_by(., date) %>% dplyr::mutate(., RatioPrice=(Price/DenominatedTicker$Price))

谢谢!

> dput(head(allCoinData))
structure(list(slug = c("bitcoin", "bitcoin", "bitcoin", "bitcoin", 
"bitcoin", "bitcoin"), symbol = c("BTC", "BTC", "BTC", "BTC", 
"BTC", "BTC"), name = c("Bitcoin", "Bitcoin", "Bitcoin", "Bitcoin", 
"Bitcoin", "Bitcoin"), date = structure(c(17167, 17168, 17169, 
17170, 17171, 17172), class = "Date"), ranknow = c(1, 1, 1, 1, 
1, 1), open = c(963.66, 998.62, 1021.6, 1044.4, 1156.73, 1014.24
), high = c(1003.08, 1031.39, 1044.08, 1159.42, 1191.1, 1046.81
), low = c(958.7, 996.7, 1021.6, 1044.4, 910.42, 883.94), close = c(998.33, 
1021.75, 1043.84, 1154.73, 1013.38, 902.2), volume = c(147775008, 
222184992, 185168000, 344945984, 510199008, 351876000), market = c(16050407461, 
16429024775, 16786368910, 18571869009, 16300254795, 14513695758
), close_ratio = c(0.892969806219017, 0.722110118189679, 0.989323843416365, 
0.95922448269866, 0.366823428815733, 0.112113955915761), spread = c(44.38, 
34.69, 22.48, 115.02, 280.68, 162.87)), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 如果您使用dput() 命令包含可重现的数据样本,则更容易。否则很难帮助你
  • 我应该通过询问进行概括:如何在按公共变量分组后对两个不同大小的数据帧进行矢量化操作。
  • 我刚刚尝试了 dput(),它输出的数据量非常大,所以我认为这里太大了,无法粘贴。
  • dput(head(allTickerData))

标签: r dataframe dplyr


【解决方案1】:

如果您分享 reproducible example,则更容易回答。您可以尝试以下答案:

library(dplyr)

DenominatedTicker <- allTickerData %>% filter(symbol == input$DenomTickerChoice)
#Get common dates
common_dates <- Reduce(intersect,split(allTickerData$Date, allTickerData$symbol))

#Filter those common_dates and then calculate the ratio.
result <- allTickerData %>%
            filter(Date %in% common_dates) %>%
            mutate(RatioPrice= Price/DenominatedTicker$Price)

【讨论】:

    【解决方案2】:

    这是另一个使用pivot_wider 的解决方案。首先,我们生成一些随机数据(因为您没有分享任何数据):

    library(tidyverse)
    library(lubridate)
    
    set.seed(0)
    
    allTickerData = sample(fruit, 5) %>%
      map(~tibble(Symbol = .x,
                  Price = abs(cumsum(rnorm(str_length(.x)))),
                  Date = seq(today() - str_length(.x), today() - 1, length.out = str_length(.x)))) %>%
      bind_rows()
    

    然后,我们可以使用pivot_wider 将数据转变成一个表格,其中每个代码都有自己的列,我们可以使用filter(across()) 删除包含NA 的行。之后,我们使用pivot_longer 来获取原始数据形状:

    allTickerData %>%
        pivot_wider(id_cols = c(Symbol, Date),
                    names_from = Symbol,
                    values_from = Price) %>%
        filter(across(-Date, ~!is.na(.x))) %>%
        pivot_longer(-Date, names_to = "Symbol", values_to = "Price")
    

    然后您可以在此使用mutate 来获取您的RatioPrice

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多