【问题标题】:How to extract all elements from a data frame that are equal to any elements of a vector? [duplicate]如何从数据框中提取与向量的任何元素相等的所有元素? [复制]
【发布时间】:2014-10-21 17:14:22
【问题描述】:

例如,我有一个包含 2 个变量 ID 和 X 的数据框,其中 X 中的值可以重复,我需要从 X 中的值为 3 或 4 的所有元素中提取 ID。

ID<-1:100
X<-round(runif(100,1,10))
data<-data.frame(ID,X)

如果我尝试这样提取它们

data$ID[data$X==c(3,4)]

我只是提取一些等于3的ID和一些等于4的ID。怎么可能呢?

【问题讨论】:

    标签: r vector dataframe extract


    【解决方案1】:

    您需要%in% 而不是==。使用== 只会匹配c(3,4) 的第一个元素

    with(data, ID[X %in% c(3, 4)])
    

    你也可以写你的句子“...我需要从所有元素中提取ID,它们在X中的值为3或4。”成一个逻辑语句

    with(data, ID[X == 3 | X == 4])
    

    【讨论】:

    • 非常感谢它帮助了我
    【解决方案2】:

    你可以试试data.tables二分查找

    library(data.table)
    setkey(setDT(data), X)[J(c(3, 4))]$ID
    

    %between%

    setDT(data)[X %between% c(3, 4)]$ID
    

    为什么?因为效率,例如:

    set.seed(123)
    n <- 1e7
    ID <- seq_len(n)
    X <- round(runif(n, 1, 10))
    data <- data.frame(ID, X)
    library(data.table)
    library(microbenchmark)
    
    all.equal(setkey(setDT(data), X)[J(c(3,4))]$ID, with(data, ID[X %in% c(3, 4)]))
    ## [1] TRUE
    all.equal(with(data, ID[X %in% c(3, 4)]), setDT(data)[X %between% c(3, 4)]$ID)
    ## [1] TRUE
    
    data2 <- copy(data)
    
    
    microbenchmark(DTbinsearch = setkey(setDT(data2), X)[J(c(3, 4))]$ID,
                   DTbetween = setDT(data2)[X %between% c(3, 4)]$ID,
                   Richard1 = with(data, ID[X %in% c(3, 4)]),
                   Richard2 = with(data, ID[X == 3 | X == 4]))
    
    # Unit: milliseconds
    #        expr      min       lq     mean   median       uq      max neval
    # DTbinsearch 101.8367 103.9708 119.3839 107.0190 120.0599 266.7725   100
    #   DTbetween 322.0519 331.0178 352.8798 344.8267 373.1562 433.3817   100
    #    Richard1 465.2885 476.6722 505.3128 492.8427 525.6999 657.7406   100
    #    Richard2 521.2169 532.5552 554.0807 542.3962 573.8510 671.9143   100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2014-12-15
      • 2021-01-11
      • 2013-03-10
      相关资源
      最近更新 更多