【问题标题】:AWS.Alexa - Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 1, 0AWS.Alexa - data.frame 中的错误(...,check.names = FALSE):参数暗示不同的行数:1、0
【发布时间】:2018-12-14 15:09:26
【问题描述】:

我正在使用 aws.alexa 包来提取 84 个不同网站的历史网络流量数据,这些数据存储在一个名为 website.names 的字符向量中。

我正在调用的函数——traffic_history()——将一个字符串作为其主要参数,并返回一个包含 5 列的数据框。知道该函数一次只返回 1 个站点的信息,我尝试创建一个循环来提取每个站点的流量历史记录,并将其存储在名为 traffic 的数据框中:

for (i in 1:length(website.names)) {
  traffic[i] <- traffic_history(paste(website.names[i], sep=""))
}

无论我尝试什么,我都会不断收到错误消息:“data.frame(..., check.names = FALSE) 中的错误:参数意味着不同的行数:1、0。”即使我将traffic 定义为与我期望它返回的尺寸相同,情况也是如此:

traffic <- as.data.frame(matrix(0, ncol = 5, nrow = 84))

任何关于如何解决此问题的想法将不胜感激。

【问题讨论】:

    标签: r function amazon-web-services vector character


    【解决方案1】:

    我没有测试traffic_history 代码的帐户,但通常您不希望附加到data.frame。我通常会创建一个 data.frames 列表(或data.tables!),然后将该列表绑定在一起。

    webnames <- c("amazon.com", "apple.com")
    dflist <- lapply(webnames, data.frame)
    data.table::rbindlist(dflist)
    #        X..i..
    # 1: amazon.com
    # 2:  apple.com
    ## OR
    do.call(rbind, dflist) ## slower, but native solution
    #        X..i..
    # 1: amazon.com
    # 2:  apple.com 
    

    如果使用 for 循环,您可以将列表预分配为:

    dflist <- vector(mode = "list", length = length(webnames))
    

    【讨论】:

    • 看起来很巧妙,尽管使用列表列表的想法很可怕。我不知道问题是否在于 website.names 是 1 列 84 行,并且该函数每行返回 5 列,但必须有一种简单的方法来存储它。
    • 这不是很多列表——它是一个列表。您将每个 data.frame 对象保存为一个列表元素(每个元素一个网站 data.frame),然后将列表折叠到最后的单个 data.frame。
    • 我第一次误解了你的评论。从技术上讲,它是一个列表列表(因为 data.frame 继承自列表),但嵌套列表并不可怕。
    • 即使website.names 和 'traffic' 都是 5 列 84 行的数据框,我仍然会遇到同样的错误。
    【解决方案2】:

    解决了。这不是存储问题。当您进入该软件包无法识别的网站时,它会引发该错误。理想情况下,它只会标记站点并返回 404 错误,但至少现在没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多