如何在R中修复“替换有x行,数据有z”

问题描述 投票:0回答:1

我有这个数据集,其中包括给定年份公司的所有销售额(公司代码= 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)

如果需要进一步的信息,请告诉我,我很乐意提供。

r database row
1个回答
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不会。
© www.soinside.com 2019 - 2024. All rights reserved.