是否可以在 for 循环中对 R 数据表进行子集化,其中循环的给定迭代的索引向量被传递给 myDT[i, j, by] 中的 j?

Posted

技术标签:

【中文标题】是否可以在 for 循环中对 R 数据表进行子集化,其中循环的给定迭代的索引向量被传递给 myDT[i, j, by] 中的 j?【英文标题】:Is it possible to subset R data tables in for loops, where the index vector of a given iteration of the loop is passed to j in myDT[i, j, by]? 【发布时间】:2022-01-21 19:33:22 【问题描述】:

我试图在 R 中使用两个嵌套的 for 循环来生成整个数据框的行和列的临时子集,以生成图形。第一个循环的索引变量被传递给 myDT[i, j, by] 中的 i,并且我对子集行没有任何问题。但是,我尝试了很多方法将内循环的索引变量传递到 j 位置,并且遇到了各种错误和意想不到的结果。请注意,full_dt 中的每一行代表一个数据点(单个图像的数字分析的几个数字结果),包括 >1 个物种 (full_dt$sp),每个部分代码 (full_dt$sect) 是唯一的,并且aoi 代码 (full_dt$aoi) 重复。

> full_dt <- fread(".../full_dt.csv")
> head(full_dt)
   V1      sp                                              sect  aoi  aoi_area n_xyl       mhwd   num_den ageClass
1:  1 cel.pal seed.cel.pal_indiv2_stem1_picture2_100x_2048x1536 aoi2 1.3964749    14 0.01538392 18.050659 Seedling
2:  2 cel.pal seed.cel.pal_indiv2_stem1_picture2_100x_2048x1536 aoi3 1.5587317    56 0.01667791 47.994443 Seedling
3:  3 cel.pal seed.cel.pal_indiv2_stem1_picture2_100x_2048x1536 aoi4 1.2133989    31 0.01551492 34.804520 Seedling
4:  4 cel.pal seed.cel.pal_indiv3_stem1_picture4_100x_2048x1536 aoi2 0.7356047    17 0.01449645 31.732125 Seedling
5:  5 cel.pal seed.cel.pal_indiv3_stem1_picture4_100x_2048x1536 aoi3 0.9252753     9 0.01550191 17.089949 Seedling
6:  6 cel.pal seed.cel.pal_indiv3_stem1_picture4_100x_2048x1536 aoi4 0.7325242     4 0.01672792  8.225981 Seedling


> age_classes <- as.vector(unique(full_dt$ageClass))
> age_classes
[1] "Seedling" "Mature"  
> data_types  <- as.vector(colnames(full_dt[,6:8]),)
> data_types
[1] "n_xyl"   "mhwd"    "num_den"


for (k in age_classes)
 for (l in data_types) 

  data_bp <- full_dt[ageClass == k, ..l,  by=.(sp,sect,aoi)]
  #ggplot() + geom_boxplot(data = data_bp, mapping = aes(x=data_bp$sp,y=data_bp$mhwd))
  #ggsave(...)

 
  

我对内部循环的每次迭代的目标是将向量 data_types 中的每个对象传递给 full_dt[i ,j, by] 中的 j 以生成一个较小的数据表,其中包含列 sp、sect、aoi 和 l 以及行其中年龄等级 == k。当 i 和 by 为空时,我已经能够使用定义为 data_types[1] 的 l 来子集 full_dt,但在定义 i 和 by 时(如上)则不行。

谢谢大家。

【问题讨论】:

在您提供的代码中,您注释掉了ggplot() 调用,但在其中您使用y = data_bp$mhwd。这可能是您的错误还是只是我们的一个例子? 请定义一个minimal example 供我们使用。 ggplot() 调用作为数据表的用途示例被包含在内,但由于它们不直接相关而被注释掉。 @FrancescoGrossetti,我不确定如何添加更具体的问题。我试图将索引向量 data_types 中的索引变量 l 传递给 myDT[i, j, by] 中的 j 位置,但未能成功。您还建议我添加什么? 【参考方案1】:

代码应如下所示:

data_bp <- full_dt[ageClass == k, .SD, .SDcols = l, by=.(sp,sect,aoi)]

添加.SD, .SDcols = l 会将full_dt$mhwd 中的值移动到data_bp$mhwd

【讨论】:

以上是关于是否可以在 for 循环中对 R 数据表进行子集化,其中循环的给定迭代的索引向量被传递给 myDT[i, j, by] 中的 j?的主要内容,如果未能解决你的问题,请参考以下文章

是否有更好的语法来对 R 中的数据框进行子集化?

For循环子集化的熊猫数据框

如何在张量流中对张量进行子集化?

如何在R中的For循环中创建动态变量名称

R中的For循环中的子集和索引

循环遍历 R 中列名的特定子集