删除数据框中引用另一个 (R) 中不存在的 ID 的行?

Posted

技术标签:

【中文标题】删除数据框中引用另一个 (R) 中不存在的 ID 的行?【英文标题】:Deleting rows in a dataframe that reference IDs that do not exist in another (R)? 【发布时间】:2019-06-10 23:12:33 【问题描述】:

我有更多的概念性问题。如果它包含对第二个数据框中不存在的数据的引用,我正在寻找一种从数据框中删除整行的方法。下面的代码将为您生成一个针对此问题的数据集。

v1 <- c(1, 2, 3, 4, 5, 6, 8)
v2 <- 100
nodedf <- data.frame(v1, v2)
colnames(nodedf)  <- ("nid", "extra_variable") 

v3 <- c(1, 2)
v4 <- c(1, 5)
v5 <- c(2, 6)
v6 <- c(3, 7)
v7 <- c(4, 9)

elementdf <- data.frame(v3, v4, v5, v6, v7)
colnames(elementdf)  <- c("eid", "n1", "n2", "n3", "n4") 

基本上,我想要来自elementdfdeleted 的任何行,如果它引用了nodedf 中不存在的节点ID(n1、n2、n3、n4)。我知道这可能是一个相当简单的问题,但我真的不擅长这种事情。谢谢。

编辑:现在我想做相反的事情,我想删除引用 elementdf 中不存在的节点的 nodedf 行。

一开始我试着像这样重新排列旧的代码块:

orphannodesbye<- nodedf[apply(nodedf[,1], 1, function(x) all(x %in% elementdf[,2:5])),] 

但是,我收到一条错误消息:

Error in apply(nodedf[, 1], 1, function(x) all(x %in% elementdf[, 2:5])) : 
  dim(X) must have a positive length

我希望输出是包含两个字段的整个 df(或更多,因为我的实际数据集有更多)nidextra_variable

【问题讨论】:

从您的示例来看,似乎不应删除 nodedf 中的任何内容(因为 nodedf 中的所有节点都出现在 elementdf 中。您的意思是,例如,v1包括9,是否应该删除带有9 的行? 对不起,我忽略了这一点。我现在只是更改了数据中的一个值以反映这一点。 查看我修改后的答案。 apply 语句真的很有必要,因为我们只是在做一些集合匹配。 【参考方案1】:

这是一个基本的 R 解决方案

elementdf[apply(elementdf[,-1], 1, function(x) all(x %in% nodedf$nid)),]

解释:

apply 通过将函数(在本例中为自定义函数)“应用”到对象 elementdf 的每一行(函数中的变量 x)来工作。如果我们想按列执行此操作,我们会将1 更改为2

我们使用的函数查看x 中的每个元素(elementdf 中的一行)并测试它是否也在nodedf 中。 %in% 是一个特殊的函数,它返回一个逻辑向量,x 中每个元素的一个元素。 all 函数返回 TRUE 如果所有元素都是TRUE(意味着它们都在nodedf 中),否则返回FALSE

所以最后,apply 语句会返回一个逻辑向量,这取决于每一行是否有在nodedf 中找到的元素。


要获取每行中不在nodedf 中的值,您可以这样做

apply(elementdf[,-1], 1, function(x) x[!(x %in% nodedf$nid)])

您会注意到它已经与上面的代码行非常相似。除了这种情况,apply 语句将返回一个列表。在您给出的示例中,它将是一个长度为 2 的列表,其中第一个元素是 numeric(0),第二个元素是包含 7 的向量。如果一行中有多个违规者,则会显示每个违规者。


要删除nodedf 中在elementdf 中没有引用的行,您可以这样做

nodedf[nodedf$nid %in% unique(unlist(elementdf[,-1])),]

unique(unlist(...)) 部分只是抓取elementdf[,-1] 中的所有唯一值,将它们转换为数字向量。

【讨论】:

这太好了,谢谢。是否可以对其进行修改以返回显示消除了哪些元素 ID 的结果?如果您还可以分解代码如何删除该行?我看到它在 elementdf 上按行应用,并且使用了字符匹配,但是代码的哪一部分告诉它要删除? @hmnoidk 编辑应该回答您的问题。如果有任何不清楚的地方,请告诉我。 @hmnoidk 是的,我进行了编辑。 [,-1] 删除第一列。 如果我理解你的意思,你想删除nodedf 中在elementdf[,2:5] 中根本找不到的节点吗?您可能想尝试nodedf$nid[nodedf$nid %in% as.numeric(unlist(elementdf[,-1]))] 之类的方法。由于nodedf$nid 是一个向量,apply 将返回该错误。 (请注意,dim(nodedf$nid)NULL。)如果您想在向量上使用 apply,请查看 ?lapply?tapply 我很难理解。也许您可以编辑问题(或提出新问题),以便准确显示您正在寻找的输出类型。我对你的问题有一个模糊的概念,但如果你能在评论之外更详细地描述它会很有帮助。

以上是关于删除数据框中引用另一个 (R) 中不存在的 ID 的行?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL删除具有引用不存在ID的参数的行

删除另一个数据框中存在的行? [复制]

删除一个表中存在而另一个表中不存在的数据?

如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?

如果在另一个数据框中确实存在,则删除行 - python pandas

选择另一个表中不存在的值