我的问题是我有一堆节点,它们在内部保存主集 x 的行号。
假设我想将集合 x 的数据拆分为两个新节点,但是当然,如果该数据已经存在于父节点中,则该数据只能放入子节点中。
为了显示
# obtain the right data from x, using your saved rowNumbers
parentData <- x[parentNode$rowNumbers, ]
# take out the rows that meet some condition based on a column value
filter <- parentData[, someColumnNumber] > someCondition
# now we obtain the actual rownames based on x
childNode$rowNumbers <- rownames(parentData[filter, ])
有没有更漂亮的方法来做到这一点?上面的代码有效,但我也一直在研究which()
,但问题是,如果你同时考虑行号和额外的列约束,你只需构建一个行数少于 x 的新 data.frame。如果您which()
在这个新的 data.frame 上使用,您将再次获得从 1 开始的索引,而不是您想要从父节点使用的索引。
编辑:
这是一个更清楚的例子来说明我的意思。
这是虚拟数据
x <- structure(list(class = c(0L, 0L, 1L, 1L, 0L), splittingHere = 28:32,
anotherColumn = c(5L, 6L, 8L, 10L, 4L)), .Names = c("class",
"splittingHere", "anotherColumn"), class = "data.frame", row.names = c(NA,
-5L))
现在想象 parentData 已经保存在里面,由于之前在某个列上的拆分,它包含第 1、2 和 4 行。所以
rowNumbers <- c(1,2,4)
parentData <- x[rowNumbers, ]
我们必须根据条件向我们的孩子发送一些值,比如说 > 30
filter <- parentData[ , 2 ] > 30
现在我想要的是满足这个条件的行号。如果我做
which(filter)
它只给了我 3,因为它是这个向量的第三个元素是正确的。但它不是 x 中的第三个!