【问题标题】:Why are values converted to strings in the rollapply window?为什么在 rollapply 窗口中将值转换为字符串?
【发布时间】:2019-02-20 19:22:41
【问题描述】:

更多新手问题...我试图了解为什么 rollapply 将我所有的列都变成字符串。假设我有这个:

> df <- data.frame(col1=c(1,2,3,4), 
                 col2=c("a","b","c","d"), 
                 col3=c("!","@","#","$"),
                 stringsAsFactors = F))
> v <- zoo(df, toupper(df$col2))
> v
  col1 col2 col3
A 1    a    !   
B 2    b    @   
C 3    c    #   
D 4    d    $  

然后我运行 rollapply:

> rollapply(v, 2, by.column = F, function(x) { 
+     sum(x[,"col1"])
+ })
 Error in sum(x[, "col1"]) : invalid 'type' (character) of argument 

为什么 col1 现在是一个字符?以及如何修复它,以便在每个窗口中获得原始动物园对象的一部分?

【问题讨论】:

  • 二维动物园对象是一个具有索引属性和动物园类的矩阵,矩阵只能有一种类型。如果您尝试混合不同的类型,R 会将它们全部转换为最低公分母。请注意,此转换是在创建动物园对象 v 时完成的。当您应用 rollapply 时,它已经属于这种类型。 rollapply 本身不会导致这种情况。
  • zoo 将您的数据转换为矩阵,并且矩阵不能容纳混合类型。由于您有一些字符值,因此所有内容都会碰到字符值。
  • 感谢您今天提供的所有帮助。关于如何修复它的任何想法? (我的 zoo 对象中有很多列,希望使用正确的列类型)

标签: r zoo


【解决方案1】:

根据对 SO 上其他 posts 的一些阅读,推出了我自己的 rollapply 函数。这只是将索引返回到数据中(即动物园对象):

rollapply.list <- function(data, width, FUN) {
  len <- NROW(data)
  add <- rep(0:(len-width),each=width)
  lst <- rep(1:(width),len-width+1)
  seq.list <- split(lst+add, add)
  lapply(seq.list, FUN)
}

然后将索引应用于原始数据,例如:

rollapply.list(data=v, width=2, FUN=function(x) {
     slice <- v[x]   #slice out indexes from the original zoo object
     ...
}

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 2016-02-27
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多