如何在R

时间:2019-04-12 23:14:18

标签: r database row

我有这个数据集,其中包含给定年份中公司的所有销售额(公司代码= gvkey,年份= fyeqarq,销售额=实际销售额)。在计算实物销售的年增长率之后,我尝试将其插入df。由于某种原因,我一直收到以下错误消息 “ $<-.data.frame*tmp*中的错误,增长率,值= c(10041 = NA ,:   替换时有204072行,数据中有204024“。

我已经尝试删除了此论坛中找到的所有NA值和其他解决方案,但不幸的是,它们均无效。

产生此错误的代码片段:

rs <- rs[order(rs$gvkey, rs$fyearq, rs$realsales),]


table(is.na(rs$realsales))


rs <- rs %>%

  group_by(gvkey) %>%
  filter(!any(is.na(realsales))) %>%
  ungroup()
rs$growth_rate <- NA

growth_rate <-function(x){
  out <- c(NA,  x[2:length(x)]/ x[1:(length(x)-1)])
  return(out)
}
rs$growth_rate <- do.call("c", by(rs$realsales,rs$gvkey, growth_rate))

如果我只运行,它将使用所有204072元素创建一个值

growth_rate <- do.call("c", by(rs$realsales,rs$gvkey, growth_rate))

我不知道它是否指向任何东西,但认为值得一提。

一切正常,直到到达最后一行。

要指出的另一重要事项是,以前的数据集并没有发生这种情况。我对它进行了一些更改,使其具有比上一个更多的观察结果,但实际上是相同的,只是更大。直到现在,我才收到此错误。一个区别是我合并了两个数据框以将名义销售额转换为实际销售额,而在上一个中我没有做过。 在我执行此操作的细分中:

df.gdpdeflator <- read.table("gdpdeflator.txt", header=TRUE)

real_sales <- left_join(sumofsalesbyfirm, df.gdpdeflator, by = "fyearq")
real_sales$realsales <- real_sales$saley/(real_sales$deflator/100)
rs <- aggregate(realsales~gvkey+fyearq, real_sales, sum)

如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:4)

只要您的2:length(x)的长度为2或更大,使用x就可以正常工作。我相信您的初衷是首先获得一切,在这种情况下,所有这些工作:

x <- 1:10
x[-1]
x[ seq_len(length(x))[-1] ]
tail(x, n=-1)
# [1]  2  3  4  5  6  7  8  9 10

让我对此正式化一点,以显示几个选项(对与错)并显示一些输出。

allbutfirst <- function(n) {
  sapply(list(
    wrong1 = 2:length(n),
    wrong2 = n[ 2:length(n) ],
    right1 = n[ -1 ],
    right2 = n[ seq_len(length(n))[-1] ],
    right3 = tail(n, n=-1)
  ), paste, collapse = ",")
}

allbutlast <- function(m) {
  sapply(list(
    wrong1 = 1:(length(m)-1),
    wrong2 = m[ 1:max(0, length(m)-1) ],
    right1 = m[ -length(m) ],
    right2 = m[ seq_len(max(0, length(m) - 1)) ],
    right3 = head(m, n=-1)
  ), paste, collapse = ",")
}
allbutfirst(1:5)
#    wrong1    wrong2    right1    right2    right3 
# "2,3,4,5" "2,3,4,5" "2,3,4,5" "2,3,4,5" "2,3,4,5" 
cat(paste(allbutfirst(1:5), collapse = "\n"))
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
# 2,3,4,5
cat(paste(allbutfirst(1), collapse = "\n"))
# 2,1
# NA,1
# 
# 
# 

wrong标签在这里是因为长度不超过2或更多时会出错...)

"2,3,4,5"表示返回的向量长度为​​4,从2迭代到5。"2,1"表示长度为2,从2递减到1(当我们不是这样做的时候)。当然,NA是不正确的。

那里的空行是相关的:它们表示少于2,并且没有返回任何内容(这是我们想要的)。要调出空字符串,我将其替换为"",仅用于显示。但是它们是空的,应该是空的。

所以这个“表”表示不同的方法

                            allbutfirst(x)     allbutlast(x)

x <- 1:5         wrong1     2,3,4,5            1,2,3,4
                 wrong2     2,3,4,5            1,2,3,4
                 right1     2,3,4,5            1,2,3,4
                 right2     2,3,4,5            1,2,3,4
                 right3     2,3,4,5            1,2,3,4

到目前为止,还不错,还没有危害。

                            allbutfirst(x)     allbutlast(x)

x <- 1           wrong1     2,1                1,0            <-- length 2, expected none
                 wrong2     NA,1               1              <-- 2 or 1, expected 0
                 right1     ""                 ""   
                 right2     ""                 ""   
                 right3     ""                 ""

x <- integer(0)  wrong1     2,1,0              1,0,-1         <-- length 3? negative?
                 wrong2     NA,NA              NA             <-- all wrong
                 right1     ""                 ""
                 right2     ""                 ""
                 right3     ""                 ""

故事的道德感

  • headtail负数一起使用效果很好
  • 使用x[-1]x[-length(x)]是等效的,并且仍然可以正常工作
  • seq_len(max(0, ...))是一种安全的处理方式; seq_len(0)始终为空,1:0不会为空。