我一直试图在 Stackoverflow 上找到类似的问题,但所有类似的问题仍然无法回答我的问题或解决此问题。
我有这个数据集,使用 which()
和其他函数,我试图找到两个条件都为真的 id。但是,我不知道如何让它在 R 中工作。它要么返回所有 id,要么返回我迄今为止尝试过的空向量。
因此,我仅针对这个问题从数据中抽取了 20 个观察值(实际数据框很大),以生成一个模拟样本来传达我的问题并在 Stackoverflow 上解决它,但我会尝试。
我有这个数据框,我想要严格包含附件 V 和附件 R 的 ID。
df
id attachment
271 1000534 V
372 1000547 V
1012 1000530 R
1568 1000539 R
1095 1000530 R
185 1000534 V
1476 1000539 R
903 1000530 R
309 1000547 V
1010 1000530 R
333 1000547 V
1094 1000530 R
1334 1000539 R
340 1000547 V
730 1000530 R
22 1000067 V
1308 1000533 R
799 1000530 R
138 1000533 V
1161 1000530 R
所以,正如我们所见,id 1000533 同时具有 V 和 R,所以我想要捕获的 id 两者兼有,我尝试了以下选项:
VR <- df[(df$attachment == 'V') & (df$attachment == 'R'),]
VR <- df[(df$attachment == 'V') && (df$attachment == 'R'),]
VR <- df[which(df$attachment == 'V') && which(df$attachment == 'R'),]
VR <- df[which(df$attachment == 'V') & which(df$attachment == 'R'),]
但它们返回一个包含所有 20 个值的数据框。当我打电话时
unique(VR$id)
它从初始数据帧返回所有 id。使用我的实际数据,它会返回一个空数据框,具体取决于我尝试了上述哪种子集尝试,但它永远不会返回我想要的 - 一个只有包含附件 V 和附件 R 的 id(或观察值)的数据框。
我做错了什么以及如何仅提取同时具有 V 和 R 的那些 id?
最佳答案
由于每个观察只有一个“依恋”级别,因此不可能同时拥有 V 和 R。
由于 ID 在观察中重复,您可以使用 intersect
来实现您想要做的事情:
myIds <- intersect(df$id[df$attachment == "V"], df$id[df$attachment == "R"])
现在 myIds 将存储同时具有 V 和 R 的 id。
myIds
[1] 1000533
在示例中是单个 id。
如果你想要只有 V 附件而不是 R 附件的观察,你可以使用 setdiff
而不是 intersect
:
myIds <- setdiff(df$id[df$attachment == "V"], df$id[df$attachment == "R"])
这里要注意的一点是 intersect 是可交换的,因此输入参数的顺序无关紧要。对于 setdiff
,顺序很重要。您可以将顺序读取为参数 1 中不在参数 2 中的元素。
关于r - 具有 2 个条件的子集不适用于哪个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410939/