我有这个数据集,其中包含给定年份中公司的所有销售额(公司代码= 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)
如果需要更多信息,请告诉我。
答案 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 "" ""
故事的道德感
head
和tail
与负数一起使用效果很好x[-1]
和x[-length(x)]
是等效的,并且仍然可以正常工作seq_len(max(0, ...))
是一种安全的处理方式; seq_len(0)
始终为空,1:0
不会为空。