【发布时间】:2013-02-20 02:17:12
【问题描述】:
我有两个数据集,它们的大小应该相同,但实际上不同。我需要修剪 A 中不在 B 中的值,反之亦然,以消除要进入报告的图表中的噪音。 (别担心,这些数据不会被永久删除!)
我已阅读以下内容:
- Selecting columns in R data frame based on those *not* in a vector
- http://www.ats.ucla.edu/stat/r/faq/subset_R.htm
- How to combine multiple conditions to subset a data-frame using "OR"?
但我仍然无法让它正常工作。这是我的代码:
bg2011missingFromBeg <- setdiff(x=eg2011$ID, y=bg2011$ID)
#attempt 1
eg2011cleaned <- subset(eg2011, ID != bg2011missingFromBeg)
#attempt 2
eg2011cleaned <- eg2011[!eg2011$ID %in% bg2011missingFromBeg]
第一次尝试只是消除结果 setdiff 向量中的第一个值。第二次尝试产生和笨拙的错误:
Error in `[.data.frame`(eg2012, !eg2012$ID %in% bg2012missingFromBeg)
: undefined columns selected
【问题讨论】:
-
我认为
merge在这里不合适。我不想合并数据集。 -
不,我认为
merge完全合适。内连接只会为您提供同时位于 A 和 B 中的行。如果合并添加了任何无关的列,则您可以对结果的列进行子集化。 -
这让我得到了适当的行数,但同样,我只剩下一个数据集。此外,从某个角度来看,这个数据集比我开始使用的数据集更脏 - 我有一个数据集,其中一些行来自“End”,一些行来自“Beg”,我不知道哪些是哪一个。
-
您首先担心的是错误的。调用合并对两个原始数据帧没有任何作用。因此,您可以执行类似
A <- merge(A,B)的操作。假设没有重复,获得正确的列并不比merge(A,B)[,colnames(A)]之类的更难。但是,如果您真的只匹配一列,那么对于您的目的而言,adibender 的解决方案可能更简单。 -
看,我同意在你的情况下,只有一个索引列,合并不是最简单的选择。但是,如果您花时间使用它,您会发现它很有可能用于此目的。重复的列在其名称后附加了
.x或 .y`,因此您可以知道它们来自哪个原始数据帧。它需要 1-2 行额外的代码,但使用merge就可以了。