Данные подмножества, основанные на отдельном кадре данных (R) - PullRequest
0 голосов
/ 15 ноября 2018

Я знаю, что варианты этого вопроса задавались ранее, и я пробовал решения из ( Выбор строк из фрейма данных на основе значений в векторе ) и ( подмножество столбца в данных фрейм, основанный на другом фрейме данных / списке ), но я не смог заставить эти решения работать. Решения продолжают возвращать фрейм данных с 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

У меня есть отдельный фрейм данных, который содержит один столбец со значениями идентификатора, который выглядит следующим образом:

> head(africa_iso)
ISO
DZA
AGO
SHN
BEN
BWA
BFA

Я бы хотел отфильтровать первый кадр данных так, чтобы остались только наблюдения, совпадающие по GID_0 и ISO (концептуально, первый набор данных включает в себя наблюдения для всех стран, я хотел бы отфильтровать его в набор данных с наблюдениями из Африки только страны). В настоящее время у меня есть 725 517 наблюдений в первом кадре данных, и я ожидаю, что после фильтрации будет примерно 200 000 наблюдений.

До сих пор это были мои попытки, и каждый раз, когда у меня остается новый фрейм данных, который имеет 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

Я уверен, что для кого-то это тривиальная проблема, но я был бы признателен за любую помощь. Спасибо.

EDIT:

> 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 ...

1 Ответ

0 голосов
/ 15 ноября 2018

Некоторые из ваших столбцов в test3 неправильные character: они встроены data.frame s, что затрудняет ваш поиск. Если вы не делаете это намеренно, вы можете исправить это с помощью:

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")
...