【问题标题】:Accessing data not existing in R dataframe访问 R 数据框中不存在的数据
【发布时间】:2020-03-20 08:23:06
【问题描述】:

我有一个名为 productCheck 的数据框:

prod <- c("GAS","GAS","GLP","GLP","GNV")
monthYear <- c("2016-06-01","2016-07-01","2016-06-01","2016-07-01","2016-07-01")
meanValue <- c(3,5,8,1,6)
price <- c(0,0,0,0,0)

productCheck <- data.frame(prod,monthYear,meanValue,price)
productCheck$prod <- as.factor(productCheck$prod)
productCheck$monthYear <- as.factor(productCheck$monthYear)

当我执行以下循环时,我得到一个错误:

for (j in levels(productCheck$prod))
{
  firstPeriod <- NA
  for (k in levels(productCheck$monthYear))
  {
    if (!is.na(firstPeriod))
    {
      secondPeriod <- k
      productCheck[productCheck$monthYear==j & productCheck$prod==secondPeriod,]$price <- 
        100*(productCheck[productCheck$monthYear==secondPeriod & productCheck$prod==j,]$meanValue - 
             productCheck[productCheck$monthYear==firstPeriod & productCheck$prod==j ,]$meanValue) /
             productCheck[productCheck$monthYear==firstPeriod & productCheck$prod==j ,]$meanValue
    }
    firstPeriod <- k
  }  
}

$&lt;-.data.frame(*tmp*, "price", value = numeric(0)) 中的错误:替换有 0 行,数据有 1

问题是 GNV 产品没有“2016-06-01”期间的信息。如何避免此错误?

【问题讨论】:

  • 您介意解释一下您要做什么以及给定数据的预期输出吗?
  • 嗨,Ronak Shah,王志强的代码完全回答了我的问题。谢谢。

标签: r loops dataframe indexoutofboundsexception


【解决方案1】:

我觉得你的代码不必要地太长了 for 循环和问题,正如你所展示的那样。我可以看到几种选择,其中之一是:

library(tidyverse)
productCheck %>% 
  pivot_wider(names_from =monthYear, values_from = meanValue) %>% 
  mutate(price = 100*(`2016-07-01` - `2016-06-01`)/`2016-06-01`)
# A tibble: 3 x 4
  prod  price `2016-06-01` `2016-07-01`
  <fct> <dbl>        <dbl>        <dbl>
1 GAS    66.7            3            5
2 GLP   -87.5            8            1
3 GNV    NA             NA            6

您的原始数据:

prod <- c("GAS", "GAS", "GLP", "GLP", "GNV")
monthYear <- c("2016-06-01", "2016-07-01", "2016-06-01", "2016-07-01", "2016-07-01")
meanValue <- c(3, 5, 8, 1, 6)
productCheck <- data.frame(prod, monthYear, meanValue)

【讨论】:

  • 感谢王志强向我介绍这些 tidyverse 函数。从现在开始,我的工作会轻松很多。
  • 我很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多