r - 基于第二个df(R)的两个属性对数据框进行子集化
问题描述
我有两个数据帧 (elementdf
和),如果数据帧之间匹配并且 z 字段>= 90 nodedf
,我想对第二个 ( ) 进行子集化。elementdf
nid
nodedf
v1 <- c(1, 2, 3, 4, 5, 6, 8, 9)
v2 <- c(90, 90, 90, 40, 20, 20, 80, 80)
nodedf <- data.frame(v1, v2)
names(nodedf) <- c("nid", "z")
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)
names(elementdf) <- c("eid", "n1", "n2", "n3", "n4")
我不需要每一个都是nid
:只要一个是,那么它就符合子集的条件(只要它也是> = 90)。elementdf
TRUE
nid
期望的输出是:
eid n1 n2 n3 n4
1 1 1 2 3 4
解决方案
拥有宽格式数据会使这变得更加困难。在这里,我们使用tidyr
进行一些重塑以使连接成为可能。
library(dplyr)
library(tidyr)
elementdf %>%
gather(source, nid, -eid) %>%
inner_join(nodedf %>% filter(z>=90)) %>%
semi_join(elementdf, .)
推荐阅读
- javascript - 需要电子/快递应用程序中的文件
- react-native - 如何在 react-native 中将输入组件滚动到 onFocus 上的屏幕顶部?
- dafny - 以二进制搜索为例了解 dafny 代码终止
- sql-server - EFCore 中的 CTE(公用表表达式)
- reactjs - React - 单击时添加活动类
- python - zeep 客户端抛出 UnicodeDecodeError utf-8 编解码器无法解码字节
- reactjs - 如何根据用户输入更新右侧的结果
- django - 带有按钮和表单的 TemplateColumn 仅返回记录名称而不是内容
- mysql - SQL中表中的重复记录具有两个相同的列值和一个不同的值
- python - 如何告诉 CMake 在 manylinux 中使用哪个 Python 版本?