2

我的问题是我有一堆节点,它们在内部保存主集 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 中的第三个!

4

2 回答 2

1

您可以使用逻辑向量完成大部分操作,而不必多次对整个 data.frame 进行子集化(如果您的 df 很大并且不使用 data.table,则可能会很慢。

这样的事情呢?

selWch <- which( parentData[ , someColumnNumber ] > someCondition )

selAll <- selWch[ selWch %in% rowNumbers ]

它从完整的 data.frame 返回行号,然后检查这些行号是否与您想要进一步使用子集的 rowNumbers 索引匹配%in%

于 2013-09-29T10:07:48.023 回答
0

....好吧,在测试我解决的例子时。

解决方案显然只是

rowNumbers[filter]
于 2013-09-29T12:24:25.547 回答