删除数据框中引用另一个 (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")
基本上,我想要来自elementdf
deleted 的任何行,如果它引用了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(或更多,因为我的实际数据集有更多)nid
和 extra_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 的行?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?