我有一个类似下面的数据集age_structure:
MACHINE_NUMBER | MACHINE_KIND
12345 | A
12346 | A
12347 | A
12345 | B
12348 | B我需要以某种方式确定两个MACHINE_KIND子集中都有哪些MACHINE_NUMBER。在这种情况下,应该只出现12345。到目前为止,我已经尝试像这样设置数据框的子集,但是因为MACHINE_KIND列不在子集中,R抛出了一个错误:
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为空。
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都是因素。明智的做法是什么?
发布于 2020-05-04 21:05:55
您可以计算为每个MACHINE_NUMBER找到的不同MACHINE_KIND的数量
library(data.table)
df[,n := uniqueN("MACHINE_KIND"), by = "MACHINE_NUMBER"][n>=2]如果您只对A和B类别感兴趣,请先过滤:
library(data.table)
df["MACHINE_KIND" %in% c("A","B"),n := uniqueN("MACHINE_KIND"), by = "MACHINE_NUMBER"][n>=2]发布于 2020-05-04 21:06:41
Base R一行:
unique(Reduce(function(x, y){setdiff(x, y)}, split(df$MACHINE_NUMBER, df$MACHINE_NUMBER)))发布于 2020-05-04 21:12:42
您可以使用dplyr包和stringr包来检查MACHINE_NUMBER是否具有这两种(或更多)类型。
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然后,您可以根据需要过滤它们,以防您想要对数据进行更多分析。
https://stackoverflow.com/questions/61592708
复制相似问题