我知道之前曾有人问过这个问题的变体,并且尝试过(Select rows from a data frame based on values in a vector)和(subset a column in data frame based on another data frame/list)的解决方案,但我无法使这些解决方案生效。解决方案不断返回具有0个观察值的数据帧。
我的第一个数据框看起来像这样:
> head(test3)
long lat time precip GID_0 GID_1 HASC_1
168.75 -46.25 Jan_1979 5.534297 NZL NZL.14_1 NZ.SO
171.25 -43.75 Jan_1979 4.191629 NZL NZL.3_1 NZ.CA
146.25 -41.25 Jan_1979 3.139199 AUS AUS.9_1 AU.TS
173.75 -41.25 Jan_1979 1.770889 NZL NZL.8_1 NZ.MA
176.25 -38.75 Jan_1979 2.257812 NZL NZL.17_1 NZ.WK
141.25 -36.25 Jan_1979 1.985313 AUS AUS.10_1 AU.VI
我有一个单独的数据框,其中包含具有ID值的单列,如下所示:
> head(africa_iso)
ISO
DZA
AGO
SHN
BEN
BWA
BFA
我想过滤第一个数据框,以便仅保留在GID_0和ISO上匹配的观测值(从概念上讲,第一个数据集包括所有国家的观测值,我想将此数据过滤为包含来自非洲的观测值的数据集仅限国家/地区)。我目前在第一个数据帧中有725,517个观测值,经过过滤后,我希望有大约200k观测值。
到目前为止,这是我的尝试,每次我留下一个新的数据框时,该数据框将包含7列且无观测值。
Afr <- subset(test3, GID_0 %in% africa_iso$ISO) #attempt 1
Afr <- setDT(test3)[GID_0 %in% africa_iso$ISO] #attempt 2
Afr <- test3[test3$GID_0 %in% africa_iso$ISO,] #attempt 3
Afr <- filter(test3$GID_0 %in% africa_iso$ISO ) #attempt 4
Afr <- setDT(test3)[GID_0 %chin% africa_iso$ISO] #attempt 5
Afr <- test3[match(test3$GID_0, africa_iso$ISO),] #attempt 6
Afr <-test3[is.element(test3$GID_0, africa_iso$ISO),] #attempt 7
我确定对于其他人来说这是一个小问题,但我将不胜感激。谢谢。
编辑:
> str(test3)
Classes ‘data.table’ and 'data.frame': 725517 obs. of 7 variables:
$ long : num 169 171 146 174 176 ...
$ lat : num -46.2 -43.8 -41.2 -41.2 -38.8 ...
$ time : Factor w/ 477 levels "Jan_1979","Feb_1979",..: 1 1 1 1 1 1 1 1 1
$ precip: num 5.53 4.19 3.14 1.77 2.26 ...
$ ISO :'data.frame': 725517 obs. of 1 variable:
..$ : chr "NZL" "NZL" "AUS" "NZL" ...
$ ISOP :'data.frame': 725517 obs. of 1 variable:
..$ : chr "NZL.14_1" "NZL.3_1" "AUS.9_1" "NZL.8_1" ...
$ HASC :'data.frame': 725517 obs. of 1 variable:
..$ : chr "NZ.SO" "NZ.CA" "AU.TS" "NZ.MA" ...
- attr(*, ".internal.selfref")=<externalptr>
还有
> str(africa_iso)
'data.frame': 62 obs. of 1 variable:
$ ISO: Factor w/ 57 levels "AGO","BDI","BEN",..: 14 1 43 3 5 4 2 8 12 6 ...
答案 0 :(得分:1)
test3
中的几列是不正确的character
:它们被嵌入data.frame
中,这使查找变得复杂。如果您不是故意这样做,则可以使用以下方法进行纠正:
isdf <- sapply(test3, is.data.frame)
test3[isdf] <- lapply(test3[isdf], `[[`, 1)
subset(test3, GID_0 %in% africa_iso$ISO)
# long lat time precip GID_0 GID_1 HASC_1
# 1 168.75 -46.25 Jan_1979 5.534297 NZL NZL.14_1 NZ.SO
# 2 171.25 -43.75 Jan_1979 4.191629 NZL NZL.3_1 NZ.CA
# 4 173.75 -41.25 Jan_1979 1.770889 NZL NZL.8_1 NZ.MA
# 5 176.25 -38.75 Jan_1979 2.257812 NZL NZL.17_1 NZ.WK
我以前将您的africa_iso
更改为包括NZL
,以便进行匹配:
> dput(africa_iso)
structure(list(ISO = structure(c(5L, 1L, 6L, 2L, 4L, 3L), .Label = c("NZL",
"BEN", "BFA", "BWA", "DZA", "SHN"), class = "factor")), row.names = c(NA,
-6L), class = "data.frame")