R 如何消除数据表上的循环?

R 如何消除数据表上的循环?,r,data.table,R,Data.table,我有两个数据。表如下所示: N = 10 A.DT <- data.table(a1 = c(rnorm(N,0,1)), a2 = NA)) B.DT <- data.table(b1 = c(rnorm(N,0,1)), b2 = 1:N) setkey(A.DT,a1) setkey(B.DT,b1) for (i in 1:nrow(B.DT)) { for (j in nrow(A.DT):1) { if (B.DT[i,b2] <= N/2

我有两个
数据。表如下所示:

N = 10
A.DT <- data.table(a1 = c(rnorm(N,0,1)), a2 = NA))
B.DT <- data.table(b1 = c(rnorm(N,0,1)), b2 = 1:N)
setkey(A.DT,a1)    
setkey(B.DT,b1)
for (i in 1:nrow(B.DT)) {
  for (j in nrow(A.DT):1) {
    if (B.DT[i,b2] <= N/2 
        && B.DT[i,b1] < A.DT[j,a1]) {
      A.DT[j,]$a2 <- B.DT[i,]$b1
      break
    }
  }
} 
我收到以下错误消息:

Error in `[<-.data.table`(`*tmp*`, j, a2, value = -0.391987468746123) : 
  object "a2" not found
我期望的结果是:

# OUTPUT
    a1  a2
1   -1.4917779  NA
2   -1.0731161  NA
3   -0.7533091  NA
4   -0.3673273  NA
5   -0.159569   NA
6   -0.1551948  NA
7   -0.0430574  NA
8   0.1783496   -0.50288835
9   0.4276034   0.24746294
10  1.0697412   0.64229018
该算法向下移动一个表,每行向上移动另一个表,检查一些条件并相应地修改值。更具体地说,它向下移动B.DT,对于B.DT中的每一行,向上移动A.DT,并将b1的第一个值赋给a2,使得b1小于a1。赋值前检查附加条件(本例中b2等于或小于5)

0.64229018是B.DT中的第一个值,分配给A.DT的最后一个单位。 1.00527902是B.DT中的第二个值,但由于其大于A.DT中的所有其他值,因此未指定该值。 0.24746294是B.DT中的第三个值,分配给A.DT中的第二个最后一个单位。 -0.5028835是B.DT中的第四个值,它被分配给A.DT中的单元#8 0.34447791是B.DT中的第五个值,由于太大,因此未指定该值


这当然是一个简化的问题(因此可能没有多大意义)。感谢您的时间和输入。

您的代码将在以下情况下运行:

A.DT[j,]$a2 <- B.DT[i,]$b1

A.DT[j,]$a2一旦创建了data.table,就不需要常规的赋值操作符
您能解释一下循环应该做什么吗?我希望在循环之后看到一个输出,以满足您的期望。还有一点解释。您的代码中充满了错误,即使在修复错误之后,您的输出仍然可能是毫无意义的。请编辑您的原始帖子,不要在注释下编写代码。对不起,我如何解释更多…哦,您太快了!我刚想好怎么做。。。非常感谢你的帮助,我理解如果你认为这些问题很愚蠢,并为浪费你的时间道歉…user22141,到目前为止,你的编辑看起来很棒。少了一件事。以一个或两个值解释如何获得输出值*。换句话说,规则是什么?谢谢,不幸的是,您的解决方案似乎不起作用。。。这就是我得到的:在
[.data.frame
(A.DT,j,a1)中出错:找不到对象“a1”…非常感谢您的帮助…嗨,Alex,当使用data.tables时,您希望避免使用

A.DT[j,]$a2 <- B.DT[i,]$b1
A.DT$a2[j,] <- B.DT[i,]$b1
 # FROM: A.DT[j,]$a2 <- B.DT[i,]$b1
 # TO: 
 A.DT[j, a2 := B.DT[i, b1] ]
set.seed(201)
A.DT <- data.table(a1 = rnorm(N,0,1), key="a1")  # no need to create a2 if it will be NA. If you do, make sure it is as.numeric(NA)
B.DT <- data.table(b1 = rnorm(N,0,1), b2 = 1:N, key="b2")

# Assign to a2 in A.DT
A.DT[            
      , a2 := B.DT[ b2 <= N/2 & b1 < a1] [1, b1]
      , by=a1
     ]


> A.DT
             a1         a2
 1: -2.30403431         NA
 2: -1.69658097         NA
 3: -1.28548252         NA
 4: -0.34454603 -0.6478531
 5: -0.07503189 -0.6478531
 6:  0.05593404 -0.6478531
 7:  0.18900414 -0.6478531
 8:  0.26693735  0.2238094
 9:  0.28606069  0.2238094
10:  0.32576373  0.2238094