R:如何将数据点作为列表分配给 bin?获取错误 - 零替换长度和警告 - 不是替换长度的倍数

R : How to assign data points to a bin as a list ? Getting error- zero replacement length and warning - not a multiple of replacememt length

请帮我找出下面代码中出了什么问题。

library(rlist)
table<-list()
bin_indices<-c(3,3,1,3,3,2,3,1,1,3)
data_indices<-c(1,2,3,4,5,6,7,8,9,10)

for(data_index in seq_along(bin_indices)){
        bin_index<-bin_indices[data_index]

        if(!(bin_index%in%table)){
        #If no list yet exists,assign the bin an empty list.
                table[bin_index]<-list()

        }

       table[bin_index]<-list.append(table[bin_index],data_index) 

        } 

当我运行上面的代码时,我得到以下错误

   Error in table[bin_index] <- list() : replacement has length zero
   In addition: Warning message:
   In table[bin_index] <- list.append(table[bin_index], data_index) :
   number of items to replace is not a multiple of replacement length 

基本上我试图将 data_indices 分配给相应的 bin 索引。有 3 个不同的 bin_indices 即 1,2 和 3 以及 10 个数据索引,其值为 1 到 10。 结果我想要

data indices 3,8,9 assigned to table[1] as a list
data indices 6     assigned to table[2] as a list
data indices 1,2,4,5,7,10 assigned to table[3] as a list

谢谢

我会使用这段代码来完成我认为你想要的:

bin_indices<-c(3,3,1,3,3,2,3,1,1,3)
data_indices<-c(1,2,3,4,5,6,7,8,9,10)

lapply(sort(unique(bin_indices)), function(x) data_indices[which(bin_indices==x)])
#> [[1]]
#> [1] 3 8 9
#> 
#> [[2]]
#> [1] 6
#> 
#> [[3]]
#> [1]  1  2  4  5  7 10

尽管您可能想要一个列表列表,而不是向量列表。如果您想要一个列表列表,请在此代码中使用 as.list(data_indices[which(bin_indices==x)])

您的代码的问题本质上是您在用其他语言思考并试图逐字翻译成 R。很难知道从哪里开始建议。问题的症结在于对 %in% 的作用存在误解。

运行这段代码并学习理解结果:

foo <- list(1:2, 1:4)
bar <- list(1:2)
baz <- 1:2
qux <- 1

qux %in% baz
qux %in% bar
qux %in% foo
baz %in% bar
baz %in% foo
bar %in% foo
foo %in% foo

在我看来,%in% 与列表一起使用是不寻常的。它主要用于原子向量(即常量向量,如 c(1,2,3)c("a","b",c"))。