首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:按不同列查找子集中的交集

R:按不同列查找子集中的交集
EN

Stack Overflow用户
提问于 2020-05-04 20:57:02
回答 4查看 35关注 0票数 0

我有一个类似下面的数据集age_structure

代码语言:javascript
运行
复制
MACHINE_NUMBER | MACHINE_KIND
         12345 | A
         12346 | A
         12347 | A
         12345 | B
         12348 | B

我需要以某种方式确定两个MACHINE_KIND子集中都有哪些MACHINE_NUMBER。在这种情况下,应该只出现12345。到目前为止,我已经尝试像这样设置数据框的子集,但是因为MACHINE_KIND列不在子集中,R抛出了一个错误:

代码语言:javascript
运行
复制
common_numbers <- Reduce(intersect, list(subset(age_structure$MACHINE_NUMBER, MACHINE_KIND == "A"), subset(age_structure$MACHINE_NUMBER, MACHINE_KIND == "B")))

object 'MACHINE_KIND' not found

age_structure名称定义为条件的一部分将运行代码而不会出错,但生成的common_numbers为空。

代码语言:javascript
运行
复制
common_numbers <- Reduce(intersect, list(subset(age_structure$MACHINE_NUMBER, age_structure$MACHINE_KIND == "A"), subset(age_structure$MACHINE_NUMBER, age_structure$MACHINE_KIND == "B")))

MACHINE_NUMBER和MACHINE_KIND都是因素。明智的做法是什么?

EN

回答 4

Stack Overflow用户

发布于 2020-05-04 21:05:55

您可以计算为每个MACHINE_NUMBER找到的不同MACHINE_KIND的数量

代码语言:javascript
运行
复制
library(data.table)
df[,n := uniqueN("MACHINE_KIND"), by = "MACHINE_NUMBER"][n>=2]

如果您只对AB类别感兴趣,请先过滤:

代码语言:javascript
运行
复制
library(data.table)
df["MACHINE_KIND" %in% c("A","B"),n := uniqueN("MACHINE_KIND"), by = "MACHINE_NUMBER"][n>=2]
票数 0
EN

Stack Overflow用户

发布于 2020-05-04 21:06:41

Base R一行:

代码语言:javascript
运行
复制
unique(Reduce(function(x, y){setdiff(x, y)}, split(df$MACHINE_NUMBER, df$MACHINE_NUMBER)))
票数 0
EN

Stack Overflow用户

发布于 2020-05-04 21:12:42

您可以使用dplyr包和stringr包来检查MACHINE_NUMBER是否具有这两种(或更多)类型。

代码语言:javascript
运行
复制
library(tidyverse)
library(stringr)

a <- tibble::tribble(
    ~MACHINE_NUMBER, ~MACHINE_KIND,
    12345L,           "A",
    12346L,           "A",
    12347L,           "A",
    12345L,           "B",
    12348L,           "B"
) 

a %>% 
    group_by(MACHINE_NUMBER) %>% 
    summarize(both = if_else(all(str_detect(MACHINE_KIND, unique(a$MACHINE_KIND))), "yes", "no"))
#> # A tibble: 4 x 2
#>   MACHINE_NUMBER both 
#> *          <int> <chr>
#> 1          12345 yes  
#> 2          12346 no   
#> 3          12347 no   
#> 4          12348 no

然后,您可以根据需要过滤它们,以防您想要对数据进行更多分析。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61592708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档