【问题标题】:Subset data.frame based on a list基于列表的子集data.frame
【发布时间】:2015-02-01 21:16:45
【问题描述】:

样本数据:https://www.dropbox.com/s/f3l2uub1cttwmf2/test.csv?dl=0

我需要仅根据在另一个数据集上可用的县代码 (fips) 对该 data.frame 进行子集化。我有一个来自其他数据集的所有 fips 代码的列表,我正在尝试删除所有不在列表中的代码,但运气不佳。

从这个小样本数据集中有三个 fip (8009,8011,8013),那么在这将是一个列表的情况下,我将如何删除除 8009 和 8011 之外的所有内容。

这是我尝试过的:

prism.dd <- prism.d[(prism.d$fips %in% fips) ,]

fips 是要保留的 779 个 fips 的列表:

fips <- unique(DustBowlData_Pre$fips)

但它只返回相同的数字。最好使用带有 data.table 的解决方案,但最好的解决方案也可以。

谢谢!

编辑:更新 akrun 的请求:

dput 的输出(head(fips))

c(8009L, 8011L, 8013L, 8017L, 8035L, 8039L)

更新:str(prism.d)

Classes ‘data.table’ and 'data.frame':  52802 obs. of  3 variables:
 $ fips: int  30061 30063 30077 30049 30013 30059 30045 30027 30069 30033 ...
 $ Year: int  1910 1910 1910 1910 1910 1910 1910 1910 1910 1910 ...
 $ ppt : num  87 64.2 52.4 46.6 34.9 ...
 - attr(*, ".internal.selfref")=<externalptr> 

解决方案:

setkey(setDT(prism.d), fips)
fips <- unique(DustBowlData_Pre$fips)
fips <- data.table(fips)
Subpr <- prism.d[fips]

感谢@akrun!这非常有效。我真的需要学习data.table。

【问题讨论】:

    标签: r dataframe data.table subset


    【解决方案1】:

    你可以试试data.table

    library(data.table)
    setkey(setDT(prism.d), fips)
    fips <- c(8009, 8011)
    fips1 <- data.table(fips)
    Subpr <- prism.d[fips1]
    

    更新

    我认为之前的代码不起作用,因为我认为数据集是 data.frame 而不是 data.table。试试

    fips2 <- fips #renaming because `prism.d` has the `same` column name `fips`
    prism.d[fips %in% fips2]
    

    数据

     prism.d <- read.csv('test-1.csv')
    

    【讨论】:

    • 感谢您,但问题是我有大量需要子集的 fips 代码 (779)。因此,虽然您的答案适用于此示例,但它不适用于我拥有的大型数据集,因为我需要列出所有 779 个 fips 代码
    • 在一个列表中。往上看。我已经使用 unique() 将 fips 代码存储到 $fips 中
    • 我将其更改为 prism.dd &lt;- prism.d[(prism.d$fips %in% unlist(fips)) ,],但它仍然返回相同数量的 obs 而没有子集
    • 另外,我不认为!在这里是合适的,因为我正在尝试专门对某些 fips 代码进行子集化
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2017-02-14
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多