Как получить анализ столбцов в R, а затем проверить соответствие? - PullRequest
2 голосов
/ 04 мая 2020

У меня есть df так:

        GEO_ID           Area           Tot_Pop 
1 8600000US00601          ZCTA5 00601   17242  
2 8600000US00602          ZCTA5 00602   38442  
3 8600000US00603          ZCTA5 00603   48814 
4 8600000US00606          ZCTA5 00606    6437  
5 8600000US00610          ZCTA5 00610   27073 
6 8600000US00612          ZCTA5 00612   60303  

Я хотел бы сделать два новых столбца. Во-первых, я хотел бы извлечь последние 5 цифр столбца GEO_ID, чтобы получить NewGeo. Во-вторых, я хотел бы потянуть строку после ZCTA5, чтобы получить NewArea. Это выглядело бы так:

        GEO_ID           Area           Tot_Pop   NewGeo  NewArea
1 8600000US00601          ZCTA5 00601   17242       00601  00601
2 8600000US00699          ZCTA5 00602   38442       00699  00602
3 8600000US00603          ZCTA5 00603   48814       00603  00603
4 8600000US00606          ZCTA5 00606    6437       00606  00606
5 8600000US00610          ZCTA5 00610   27073       00610  00610
6 8600000US00612          ZCTA5 00612   60303       00612  00612

Затем я хотел бы проверить, совпадают ли новые столбцы NewGeo с NewArea, а если нет, я бы хотел создать новый df для просмотра отдельные столбцы, которые не соответствуют

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

В вашем случае, с data.table, вы можете сделать

library(data.table)
setDT(df)
df[, `:=`(NewGeo = tstrsplit(GEO_ID, "US", fixed = TRUE)[2],
          NewArea = tstrsplit(Area, " ", fixed = TRUE)[2])]

Если вы хотите их в формате нумерации c, вы можете потом сделать:

df[,c('NewGeo','NewArea') := lapply(.SD, as.numeric), .SDcols = c('NewGeo','NewArea')]

tstrsplit - это встроенный data.table для эффективной резки струн. У вас есть возможные варианты с stringr (однако вы не уверены в этом)

df[, `:=`(NewGeo = stringr::str_split_fixed(GEO_ID, "US", simplify = TRUE)[,2],
          NewArea = stringr::str_split_fixed(Area, " ", simplify = TRUE)[,2])]
3 голосов
/ 04 мая 2020

Мы можем использовать tidyverse

library(dplyr)
library(stringr)
df1 %>%
  mutate(NewGeo = str_extract(GEO_ID, "\\d+$"),
         NewArea = str_extract(Area, "\\d+$"),
         checkEqual = NewGeo == NewArea)

Или использовать mutate_at

df %>%
  mutate_at(vars(GEO_ID, Area), list(New = ~str_extract(., "\\d+$")))

В новой версии dplyr можно использовать across с mutate

df %>%
  mutate(across(c(GEO_ID, Area), list(New = ~str_extract(., "\\d+$")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...