我有这个数据集,其中包括给定年份公司的所有销售额(公司代码= gvkey,年份= fyeqarq,sales = realsales)。在计算了realsales的年增长率之后,我尝试将它们插入到df中。出于某种原因,我一直收到以下错误消息“$<-.data.frame
中的错误(*tmp*
,growth_rate,value = 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)
如果需要进一步的信息,请告诉我,我很乐意提供。
只要您的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
不会。