【问题标题】:R - data.table and loopsR - data.table 和循环
【发布时间】:2014-12-19 02:22:38
【问题描述】:

我有一个名为“dt”的数据集,它采用 data.table 格式。我正在尝试根据同一数据集中的现有变量创建多个变量并将其附加到该数据集,如下所示:

for (i in 1:17){
dt[, list(tmp_var[i] = Dose[i] * Freq[i] * (NA^!grepl("^12345",DRUG[i])))]
}

换句话说,在 dt 中搜索整数 12345 并在任何找到的地方,将以下两列(对应于同一行)的乘积分配给一个新变量:tmp_var[i]。

这似乎不起作用,生成的错误消息显示为:错误:“}”中的意外'}'

有人可以发现问题或提出替代方法吗?

谢谢。

【问题讨论】:

  • 祈祷告诉...什么是 NA 提升到任何权力???并产生一个可重复的例子
  • @mazkaz 我认为你需要使用dt[[paste0(Dose,i)]] 和类似的Freqtmp_var 等,我在你之前的问题中展示过。
  • @mazkaz 您也可以根据您之前的示例检查dt[,Dose[1]]#Error in eval(expr, envir, enclos) : object 'Dose' not founddt[,dt[[paste0('Dose',1)]]]#[1] 2 2 4

标签: r for-loop data.table


【解决方案1】:

您可以使用的一个选项是get,假设DoseDrug 等是具有相应列名的单独对象。对于 3 列的情况:

Dose <- paste0("Dose", 1:3)
Freq <- paste0("Freq", 1:3)
Drug <- paste0("Drug", 1:3)
tmp_var <- paste0("New_Var", 1:3)

 for(i in 1:3){
 dt[, (tmp_var[i]):= get(Dose[i]) * get(Freq[i])
                          *(NA^!grepl("^12345",get(Drug[i])))]
 }

但是,我会使用dt[[Dose[i]]] 而不是这个

 dt
 #        Drug1 Dose1 Freq1      Drug2 Dose2 Freq2      Drug3 Dose3 Freq3
 #1: 1234567890     2     1 1548768954    23   2.0 2222132435     2     2
 #2: 4356678344     2     2 6547894356     3   1.0 2123456789     2     2
 #3: 5673452976     4     1 1234567890     4   0.5 4568789076    33     4
 #  New_Var1 New_Var2 New_Var3
 #1:        2       NA       NA
 #2:       NA       NA       NA
 #3:       NA        2       NA

更新

另一种选择是使用比get 更快的eval

 for(i in 1:3){
   Dose <- as.symbol(paste0('Dose', i))
   Freq <- as.symbol(paste0('Freq',i))
   Drug <- as.symbol(paste0('Drug', i))
   dt[,(tmp_var[i]):= eval(Dose)*eval(Freq)*
                   (NA^!grepl('^12345', eval(Drug)))]
    }

 dt
 #        Drug1 Dose1 Freq1      Drug2 Dose2 Freq2      Drug3 Dose3 Freq3
 #1: 1234567890     2     1 1548768954    23   2.0 2222132435     2     2
 #2: 4356678344     2     2 6547894356     3   1.0 2123456789     2     2
 #3: 5673452976     4     1 1234567890     4   0.5 4568789076    33     4
 #   New_Var1 New_Var2 New_Var3
 #1:        2       NA       NA
 #2:       NA       NA       NA
 #3:       NA        2       NA

数据

 df <- structure(list(Drug1 = c(1234567890, 4356678344, 5673452976), 
 Dose1 = c(2L, 2L, 4L), Freq1 = c(1L, 2L, 1L), Drug2 = c(1548768954, 
 6547894356, 1234567890), Dose2 = c(23L, 3L, 4L), Freq2 = c(2, 
 1, 0.5), Drug3 = c(2222132435, 2123456789, 4568789076), Dose3 = c(2L, 
 2L, 33L), Freq3 = c(2L, 2L, 4L)), .Names = c("Drug1", "Dose1", 
 "Freq1", "Drug2", "Dose2", "Freq2", "Drug3", "Dose3", "Freq3"
 ), class = "data.frame", row.names = c(NA, -3L))    

 dt <- as.data.table(df)

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2021-06-25
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多