【问题标题】:how to deal with nrows when creating an empty data.table?创建空data.table时如何处理nrows?
【发布时间】:2016-06-27 02:12:34
【问题描述】:

假设我要创建一个data.table,有两种情况,当我知道行数时,当我不知道行数时。 万一我找不到任何关于创建具有一定行数的空 data.table 的具体内容。

如果有两种情况,最好先创建一个单行 data.table 还是只是高估 nrows?

编辑:是否有行数参数?

【问题讨论】:

  • 在什么意义上它是空的? Data.tables 和 data.frames 不是为了动态增长它们的#rows 而构建的,如果你是这样想的话。
  • 从某种意义上说,它是 NA,不知道它必须是多少行。
  • 对于空数据表,您可以使用空列进行初始化:dt <- data.table(x=character(),y=numeric())。同样对于具有已知行/列的 data.table,一种方法(尽管如果有更好的方法有人可以权衡)是使用NA 进行初始化。 dt <- data.table(x=as.character(rep(NA,100)),y=as.numeric(rep(NA,100)))
  • 我想知道是否有nrow参数,我在文档中找不到。
  • 您可能有兴趣知道 data.frame 也没有 nrow 参数,并且这个问题对这些对象没有意义......在@MikeyMike 的方法中,您也可以做DT = data.table(x=character(),y=numeric())[1:100] 和用你的 nrow 替换 100。

标签: r dataframe data.table


【解决方案1】:

假设您事先知道列的类别,您可以这样做:

对于一个空的data.table

dt <- data.table(x=character(),y=numeric())

如果您想将结果实际添加到空的 data.table 中,则需要附加它们(创建空的 data.table 没有多大意义的部分原因)。像这样的:

dt <- rbind(dt,data.table(x=1),fill=TRUE)

对于具有已知行的 data.table

nrow <- 100
dt <- data.table(x=as.character(rep(NA,nrow)),y=as.numeric(rep(NA,nrow)))

或者,对于具有已知行的数据表,您可以使用@Frank 的方法(我个人更喜欢它,因为它稍微短一些):

dt <- data.table(x=character(),y=numeric())[1:nrow]

【讨论】:

  • 我发现创建一个没有行的 dt 这不是一个好主意,因为我无法将元素添加到一行的一列。 dt$x[1]=65 > dt Empty data.table (0 rows) of 2 cols: x,y
  • 是的,那是因为 dt$x[1] 不存在。使用空的 data.table,您将不得不在其上附加您的结果。它没有真正意义的原因之一。试试这个:dt &lt;- rbind(dt,data.table(x=1),fill=TRUE)
【解决方案2】:
# When you know the number of rows, e.g. 5 rows and 3 columns
DT = data.table(matrix(vector(), 5, 3, dimnames=list(c(), c("Date", "File", "User"))), stringsAsFactors=F)

# When you don't know the number of rows, just start with 1 and add as needed
DT = data.table(matrix(vector(), 1, 3, dimnames=list(c(), c("Date", "File", "User"))), stringsAsFactors=F)

还有其他可能不那么冗长的方法,但我喜欢这种方法,因为您可以轻松地将data.table 切换为其他类型,例如data.frame,并且一切正常。

【讨论】:

  • 谢谢,是否有必要使用构造matrix(vector()等... 是否可以使用data.table("col1"=0,"col2=0", nrows= 10)? 我找不到正确的语法
  • @user4050 使用matrix 函数只是一种方法,是的。我使用它是因为我可以将data.table 切换为data.frame 和其他东西,它仍然有效。
  • 行数的语法是什么,我试过nrow和nrows,都不管用。谢谢
  • @user4050 在我看来,控制行数的部分是matrix 的第二个参数中的第一个数字(即 5 和 1)。 ?matrix 有更多细节。我不太确定其他方法,因为我总是使用它,但data.table 的所有参数都列在?data.table 中。我没有看到 nrows 或那里的任何东西。
  • 我认为最好给列提供正确的类(而不是将它们全部初始化为逻辑)。如果您尝试分配给行的子集,DT[1, File := "file.csv"] 它将强制为逻辑。这就是为什么通常不建议对 cbind-ing 列执行 data.table(matrix()) 或 data.frame(matrix()) 或相同操作的原因。 MikeyMike 的建议是标准的。
【解决方案3】:

如果您可能希望将一个 data.table 列名(调用)保留到另一个 data.table(undervaluedCalls)以及类类型,您可以使用以下代码:

undervaluedCalls <- as.data.table(calls)[0] # copy the column structure of calls
undervaluedCalls <- undervaluedCalls[1:10000] # add 10000 NA rows preseving column classes

列名是:

colnames(调用) [1] “期权”“代码”“Undl_Price”“到期”“Days_to_Exp”“罢工”“买入”“卖出”“Mid_Price”
[10]“最后”“变化”“音量”“OI”

检查列类运行:

sapply(undervaluedCalls, class)

对我来说,这是创建新 data.tables 的最短方式。之后您可以删除空行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2021-06-15
    • 2013-02-10
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多