是否可以在 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?的主要内容,如果未能解决你的问题,请参考以下文章