子集data.frame基于列表

时间:2014-12-04 04:45:37

标签: r dataframe data.table subset

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

我需要仅基于另一个数据集上可用的县代码(fips)来对此data.frame进行子集化。我有一个来自其他数据集的所有fips代码的列表,并且我试图删除列表中没有的所有fips代码,但是没有太多运气。

从这个小样本数据集中有三个fips(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的请求:

输出(头部(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。

1 个答案:

答案 0 :(得分: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')