【问题标题】:Subset based on first three numbers基于前三个数字的子集
【发布时间】:2015-01-21 06:05:56
【问题描述】:

我有一个非常大的变量数据集,我需要根据邮政编码的前三个数字进行子集化。我不确定如何做到这一点,并希望您能提供任何帮助。

我将如何对这个示例 dput 进行子集化以删除所有以 721 开头的邮政编码。请注意,我不能简单地做大于 (>),因为有大于 721 的邮政编码谢谢!

输入:

data <- structure(list(state = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("AR", 
  "IL", "MO"), class = "factor"), zip = c(72003L, 72042L, 72073L, 
  72166L, 72038L, 72055L, 72160L, 72026L, 72048L, 72140L, 72003L, 
  72042L, 72073L, 72166L, 72038L, 72055L, 72160L, 72026L, 72048L, 
  72140L)), .Names = c("state", "zip"), row.names = c(NA, 20L), class = "data.frame")

数据:

   state   zip
1     AR 72003
2     AR 72042
3     AR 72073
4     AR 72166
5     AR 72038
6     AR 72055
7     AR 72160
8     AR 72026
9     AR 72048
10    AR 72140
11    AR 72003
12    AR 72042
13    AR 72073
14    AR 72166
15    AR 72038
16    AR 72055
17    AR 72160
18    AR 72026
19    AR 72048
20    AR 72140

【问题讨论】:

    标签: r subset


    【解决方案1】:

    你可以试试substr

    data[substr(data$zip, 1,3)!=721,]
    

    或使用data.table

    library(data.table)
    setDT(data)[substr(zip,1,3)!=721]
    

    dplyr

    library(dplyr)
    data %>% 
          filter(substr(zip, 1,3)!=721)
    

    或者使用来自tidyrextract

    library(tidyr)
    extract(data, zip, 'zip1', '(...).*', FALSE) %>% 
                                  filter(zip1!=721) %>% 
                                  select(-zip1)
    

    【讨论】:

    • 谢谢阿克伦。这可以通过filter 与 dplyr 做吗?
    • @Amstell 您也可以在filter 中使用相同的命令。请检查更新
    • 有没有一种快速的方法可以添加多个 3 位代码而无需再次写出整行,例如 c(720, 721) ?这似乎不起作用
    • @Amstell 您使用%in% 而不是== 用于多个元素。 IE。 data %&gt;% filter(!substr(zip, 1,3) %in% c(720, 721))我没有使用%in%,因为它可能比==慢一点
    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多