根据另一个2设置数据框

时间:2017-11-10 17:02:55

标签: r subset

尝试对here提出的问题进行回答,但无法查看我出错的地方。

我试图使用公共字段从另一个数据帧中列出的一个数据帧观察中提取。引用的问题并不完全相同,但建议使用" setdiff"对于相关问题,这似乎符合我的需要。

以下是我设置的示例:

    # orginal dataframe
    origdf <- data.frame(apple = c(111, 2, 4, "fox"), 
             orange=c( 222, 11, 12, 14), 
             pear=c( "one", "two", 10, 11),
             peach=c("which", "way", "to", "go"),
             banana=c(333, 22, 23, 24),
             grape=c(77, 78, 79, 80))
    origdf
    # a separate process produces a dataframe with observations to be extracted from the original dataframe
    extract <- origdf[which(origdf$apple == 111 |
                origdf$apple == "fox"), ]
    extract
    test <- origdf[setdiff(origdf$apple, extract$apple)]
    test

    # the above returns an error that "undefined columns selected", but the following works...
    origdf$apple
    extract$apple

为什么我遇到这个问题?

1 个答案:

答案 0 :(得分:1)

如评论中所述,您收到错误是因为您错过了逗号:

test <- origdf[setdiff(origdf$apple, extract$apple)]

没有它,R认为你是列的子集。因此选择&#34;未定义的列&#34;

您的第二个问题是使用setdiff进行索引。在对data.frame的行进行子集化时,您需要提供索引或逻辑向量,以指示特定行是否应包含在最终子集中。但是,以下是

setdiff(origdf$apple, extract$apple)

返回:

[1] "2" "4"

调用时会隐式强制c(2, 4)

test <- origdf[setdiff(origdf$apple, extract$apple),]

因为R认为你是按索引进行子集化。因此返回:

  apple orange pear peach banana grape
2     2     11  two   way     22    78
4   fox     14   11    go     24    80

要返回您真正想要的内容,您可以使用%in%返回origdf$apple setdiff中是否test <- origdf[origdf$apple %in% setdiff(origdf$apple, extract$apple),] 的逻辑向量:

  apple orange pear peach banana grape
2     2     11  two   way     22    78
3     4     12   10    to     23    79

返回:

origd$apple

另一种方法是检查%in%extract$apple !并返回不是(test <- origdf[!origdf$apple %in% extract$apple,] )的行:

from ParentClass import ParentClass