【问题标题】:R: putting elements in listR:将元素放入列表
【发布时间】:2018-09-09 19:48:25
【问题描述】:

这里的总 R 菜鸟。

我在创建股票代码列表时遇到了困难。

情况如下:

我创建了一个从 Quandl 的 API 中提取的代码数据框。

x1<-Quandl.datatable('SHARADAR/SF1',paginate=TRUE, 
                 qopts.columns=c('ticker'))

然后我尝试将此数据框放入列表中。

x2<-as.list(x1)

这样我就可以使用 API 为列表中的所有代码提取数据。

x3<-Quandl.datatable('SHARADAR/SF1',paginate=TRUE, 
                 qopts.columns=c('ticker','dimension','datekey','revenue'),
                 dimension='ART', calendardate='2015-12-31',ticker=c(x2))

但是,唉,这行不通。

但是,将其与我提取特定代码时进行比较:

Quandl.datatable('SHARADAR/SF1', ticker=c('AAPL', 'TSLA'))
z = list('AAPL','TSLA')

代码自行运行:

x3<-Quandl.datatable('SHARADAR/SF1',paginate=TRUE, 
                 qopts.columns=c('ticker','dimension','datekey','revenue'),
                 dimension='ART', calendardate='2015-12-31',ticker=z)

这是因为每个代码都是它自己在列表(z)中的组件:

[[1]] [1] “苹果”

[[2]] [1] “特斯拉”

而对于 x2,所有代码都存储为单个列表组件:

[1]“AAPL”、“TSLA”等

因此,如果我能找到一种方法将向量 x2 转换为一个列表,其中每个元素都是它自己的组件。

非常感谢(也感谢您的耐心!)

【问题讨论】:

  • 尝试as.list(1:5000) - 1:5000 创建一个从 1 到 5000 的序列数字向量。list(...) 然后将您刚刚创建的数字向量分配为新列表的第一个元素。
  • 当你尝试我原来的建议时会发生什么,x2 = sapply(x1, list)?
  • 它仍然是一个长度为 1 的列表。这是否与数据帧的长度等于列数而不是元素数有关?
  • 问题应该有人们可以复制的例子。我没有安装 Quandl,所以很难提供帮助。你能显示 str(x1) 的输出吗?如果 x1 是长度为 1 的列表,则尝试 sapply(x1[[1]], list)
  • 无论如何都非常感谢!是的,str(x1) 的长度为 1,当我使用 sapply(x1[[1[[,list) 时,它只是回弹:'dataframe': 5375 obs。 1 个变量:$ 股票代码:chr "A" "AA" "AAAP" ...

标签: r list vector


【解决方案1】:

这应该可行:

x = sapply(1:5000, list)

长度为5000:

length(x)
[1] 5000

所有元素都是整数:

all(sapply(x, is.integer) == TRUE)
[1] TRUE

这也适用于字符向量:

sapply(c('AAPL', 'MSFT', 'AMZN'), list)

$AAPL
[1] "AAPL"

$MSFT
[1] "MSFT"

$AMZN
[1] "AMZN"

【讨论】:

  • 向量包含字符,出于某种原因,使用上述代码和类似代码,结果列表最终会包含一个组件中的所有元素,即无法创建包含 5000 个元素的列表。
  • 真的吗? length(sapply(1:5000, list)) = 5000。元素是整数,而不是字符...
  • 对不起!我应该澄清一下。我的数据实际上是数千个股票代码的数据框。我需要一个列表,其中每个股票代码都是列表的一个单独组件,用于从 API 调用其他数据。
  • 你能发布一个更好的例子吗?这个解决方案也适用于字符,所以有点不清楚你要做什么。
  • 考虑以下列表:
【解决方案2】:

一个选项可以是:

x1 <- c(list(),1:5000)
str(x1)
# List of 10
# $ : int 1
# $ : int 2
# $ : int 3
# $ : int 4
# $ : int 5
# $ : int 6
# $ : int 7
# $ : int 8
#...
#.....

【讨论】:

    【解决方案3】:

    x1 是一列数据框。因为data.frame 在底层确实是list,所以as.list() 只为您提供列列表,在本例中为list(x1$column1)

    您需要在 vector 上运行 as.list 以获得您想要的结果。这些都可以工作:

    as.list(x1$your_column_name)
    as.list(x1[["your_column_name"]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2023-03-21
      • 1970-01-01
      • 2015-12-16
      相关资源
      最近更新 更多