2014-02-19 34 views
1

根据“关于R中data.table包的常见问题”,可以通过DT [0]创建一个表的模板(如果有data.table DT)。但是,当我尝试为列分配一些值时,它不允许我这样做。这是我尝试过的。如何将值赋给零对象data.table? R

Binary.Table = matrix(0, nrow = 7, ncol = 26) 
Binary.Table = data.table(Binary.Table) 
setnames(Binary.Table, names(Binary.Table), c('JustDay', letters[1:25])) 
Binary.Table[, JustDay := c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")] 

我需要使用此表作为我的新表的模板。所以,我这样做

DT.New <- Binary.Table[0] 

现在,我的DT.New是一个零obs data.table。然后,我想将日期分配给'JustDay'(或另一个)列。我用

DT.New[, JustDay := c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")] 

但它不以我需要的方式工作。我的代码中是否有任何错误?和如何做到这一点?谢谢。

回答

0

我有这样的感觉,即以相同的方式将数据行添加到数据表是非常棘手的。你可以做这样的事情来得到它的工作:

DT.template <- Binary.Table[0] 
setkey(DT.template,JustDay) 
DT.New <- DT.template[J(c("Monday", "Tuesday", "Wednesday", 
          "Thursday", "Friday", "Saturday", "Sunday")),] 

如果键列是不是你的模板的第一列,这将是DT.New的第一列。为了保存列的顺序,你可以做到以下几点:

numNewLines <- 7 # e.g. number of weekdays 

setkeyv(DT.template,colnames(DT.template)[1]) 
createKey <- rep(new(typeof(DT.template[[1]]),NA),numNewLines) 
DT.New <- DT.template[J(createKey),] 

一旦创建行的必要量,你可以对它们再次以通常的方式进行操作,例如

DT.New[,JustDay:=c("Monday", "Tuesday", "Wednesday", 
        "Thursday", "Friday", "Saturday", "Sunday")] 
+0

非常感谢。我必须学习更多关于J()和另一个函数。 – Phongsakorn

1

我看你已经接受了答案,但无论如何...我会做这样的:

ct <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") 
setkey(DT.New, JustDay) # need to set the key before using i on the next line 
DT.New[.(ct), nomatch=NA] 
    JustDay a b c d e f g h i j k l m n o p q r s t u v w x y 
1: Monday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
2: Tuesday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
3: Wednesday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
4: Thursday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
5: Friday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
6: Saturday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
7: Sunday NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 

:=旨在通过参考更改值,所以你需要确保有一些参考(因此nomatch=NA选项;这是默认的,但我已经包括它为清楚起见)。