交换R中放错的单元格?

交换R中放错的单元格?,r,R,我有一个巨大的数据库(超过6500万行),我注意到一些单元格放错了位置。举个例子,假设我有: library("tidyverse") DATA <- tribble( ~SURNAME,~NAME,~STATE,~COUNTRY, 'Smith','Emma','California','USA', 'Johnson','Oliia','Texas','USA', 'Williams','James','USA','California', 'Jones','Noa

我有一个巨大的数据库(超过6500万行),我注意到一些单元格放错了位置。举个例子,假设我有:

library("tidyverse")

DATA <- tribble(
  ~SURNAME,~NAME,~STATE,~COUNTRY,
  'Smith','Emma','California','USA',
  'Johnson','Oliia','Texas','USA',
  'Williams','James','USA','California',
  'Jones','Noah','Pennsylvania','USA',
  'Williams','Liam','Illinois','USA',
  'Brown','Sophia','USA','Louisiana',
  'Daves','Evelyn','USA','Oregon',
  'Miller','Jacob','New Mexico','USA',
  'Williams','Lucas','Connecticut','USA',
  'Daves','John','California','USA',
  'Jones','Carl','USA','Illinois'
)
库(“tidyverse”)
数据数据
#一个tibble:11 x 4
姓国名国
1美国加利福尼亚州史密斯艾玛酒店
2美国德克萨斯州约翰逊奥利亚酒店
3威廉斯·詹姆斯美国加利福尼亚州
美国宾夕法尼亚州琼斯诺亚4号
美国伊利诺伊州威廉斯·利亚姆5号
6美国路易斯安那州布朗索菲亚酒店
7美国俄勒冈州戴维·伊夫林
美国新墨西哥州米勒雅各布8号
9美国康涅狄格州威廉斯卢卡斯酒店
10美国加利福尼亚州戴维·约翰
美国伊利诺伊州琼斯卡尔11号
如你所见,国家和州在某些行中放错了位置,我如何有效地交换这些行

亲切问候,, Luiz.

检查此解决方案(假设
国家
列采用ISO3格式,例如MEX、CAN):

检查此解决方案(假设
国家
列采用ISO3格式,例如MEX、CAN):


假设所有国家的名称都遵循ISO3格式,我们可以首先安装
countrycode
软件包。在这个包中,有一个名为
codelist
的数据框,其中有一列
iso3c
,其中包含ISO3国家名称。我们可以按如下方式使用它来交换国家名称

library(tidyverse)
library(countrycode)

DATA2 <- DATA %>%
  mutate(STATE2 = ifelse(STATE %in% codelist$iso3c & 
                           !COUNTRY %in% codelist$iso3c, COUNTRY, STATE),
         COUNTRY2 = ifelse(!STATE %in% codelist$iso3c & 
                             COUNTRY %in% codelist$iso3c, COUNTRY, STATE)) %>%
  select(-STATE, -COUNTRY) %>%
  rename(STATE = STATE2, COUNTRY = COUNTRY2)

DATA2
# # A tibble: 11 x 4
#    SURNAME  NAME   STATE        COUNTRY
#    <chr>    <chr>  <chr>        <chr>  
#  1 Smith    Emma   California   USA    
#  2 Johnson  Oliia  Texas        USA    
#  3 Williams James  California   USA    
#  4 Jones    Noah   Pennsylvania USA    
#  5 Williams Liam   Illinois     USA    
#  6 Brown    Sophia Louisiana    USA    
#  7 Daves    Evelyn Oregon       USA    
#  8 Miller   Jacob  New Mexico   USA    
#  9 Williams Lucas  Connecticut  USA    
# 10 Daves    John   California   USA    
# 11 Jones    Carl   Illinois     USA   
库(tidyverse)
图书馆(国家代码)
数据2%
变异(STATE2=ifelse)(状态%in%codelist$iso3c&
!国家/地区%in%代码列表$iso3c,国家/地区,州),
COUNTRY2=ifelse(!在%codelist$iso3c&
%codelist$iso3c中的国家%(国家,州))%>%
选择(-STATE,-COUNTRY)%%>%
重命名(STATE=STATE2,COUNTRY=COUNTRY2)
数据2
##A tibble:11 x 4
#姓国名国
#                    
#1美国加利福尼亚州史密斯艾玛酒店
#2美国德克萨斯州约翰逊奥利亚酒店
#3威廉斯·詹姆斯美国加利福尼亚州
#美国宾夕法尼亚州琼斯诺亚4号
#美国伊利诺伊州威廉斯·利亚姆5号
#6美国路易斯安那州布朗索菲亚酒店
#7美国俄勒冈州戴维·伊夫林
#美国新墨西哥州米勒雅各布8号
#9美国康涅狄格州威廉斯卢卡斯酒店
#10美国加利福尼亚州戴维·约翰
#美国伊利诺伊州琼斯卡尔11号

假设所有国家的名称都遵循ISO3格式,我们可以首先安装
countrycode
软件包。在这个包中,有一个名为
codelist
的数据框,其中有一列
iso3c
,其中包含ISO3国家名称。我们可以按如下方式使用它来交换国家名称

library(tidyverse)
library(countrycode)

DATA2 <- DATA %>%
  mutate(STATE2 = ifelse(STATE %in% codelist$iso3c & 
                           !COUNTRY %in% codelist$iso3c, COUNTRY, STATE),
         COUNTRY2 = ifelse(!STATE %in% codelist$iso3c & 
                             COUNTRY %in% codelist$iso3c, COUNTRY, STATE)) %>%
  select(-STATE, -COUNTRY) %>%
  rename(STATE = STATE2, COUNTRY = COUNTRY2)

DATA2
# # A tibble: 11 x 4
#    SURNAME  NAME   STATE        COUNTRY
#    <chr>    <chr>  <chr>        <chr>  
#  1 Smith    Emma   California   USA    
#  2 Johnson  Oliia  Texas        USA    
#  3 Williams James  California   USA    
#  4 Jones    Noah   Pennsylvania USA    
#  5 Williams Liam   Illinois     USA    
#  6 Brown    Sophia Louisiana    USA    
#  7 Daves    Evelyn Oregon       USA    
#  8 Miller   Jacob  New Mexico   USA    
#  9 Williams Lucas  Connecticut  USA    
# 10 Daves    John   California   USA    
# 11 Jones    Carl   Illinois     USA   
库(tidyverse)
图书馆(国家代码)
数据2%
变异(STATE2=ifelse)(状态%in%codelist$iso3c&
!国家/地区%in%代码列表$iso3c,国家/地区,州),
COUNTRY2=ifelse(!在%codelist$iso3c&
%codelist$iso3c中的国家%(国家,州))%>%
选择(-STATE,-COUNTRY)%%>%
重命名(STATE=STATE2,COUNTRY=COUNTRY2)
数据2
##A tibble:11 x 4
#姓国名国
#                    
#1美国加利福尼亚州史密斯艾玛酒店
#2美国德克萨斯州约翰逊奥利亚酒店
#3威廉斯·詹姆斯美国加利福尼亚州
#美国宾夕法尼亚州琼斯诺亚4号
#美国伊利诺伊州威廉斯·利亚姆5号
#6美国路易斯安那州布朗索菲亚酒店
#7美国俄勒冈州戴维·伊夫林
#美国新墨西哥州米勒雅各布8号
#9美国康涅狄格州威廉斯卢卡斯酒店
#10美国加利福尼亚州戴维·约翰
#美国伊利诺伊州琼斯卡尔11号

使用
数据。表
和内置的
状态。名称
向量:

setDT(DATA)
DATA[COUNTRY %in% state.name, `:=`(COUNTRY = STATE, STATE = COUNTRY)]

DATA
#      SURNAME   NAME        STATE COUNTRY
#  1:    Smith   Emma   California     USA
#  2:  Johnson  Oliia        Texas     USA
#  3: Williams  James   California     USA
#  4:    Jones   Noah Pennsylvania     USA
#  5: Williams   Liam     Illinois     USA
#  6:    Brown Sophia    Louisiana     USA
#  7:    Daves Evelyn       Oregon     USA
#  8:   Miller  Jacob   New Mexico     USA
#  9: Williams  Lucas  Connecticut     USA
# 10:    Daves   John   California     USA
# 11:    Jones   Carl     Illinois     USA

使用
data.table
和内置的
state.name
向量:

setDT(DATA)
DATA[COUNTRY %in% state.name, `:=`(COUNTRY = STATE, STATE = COUNTRY)]

DATA
#      SURNAME   NAME        STATE COUNTRY
#  1:    Smith   Emma   California     USA
#  2:  Johnson  Oliia        Texas     USA
#  3: Williams  James   California     USA
#  4:    Jones   Noah Pennsylvania     USA
#  5: Williams   Liam     Illinois     USA
#  6:    Brown Sophia    Louisiana     USA
#  7:    Daves Evelyn       Oregon     USA
#  8:   Miller  Jacob   New Mexico     USA
#  9: Williams  Lucas  Connecticut     USA
# 10:    Daves   John   California     USA
# 11:    Jones   Carl     Illinois     USA

您是否有详尽正确的州和国家列表?您如何确定需要进行掉期的行?对不起,我使用国家作为我的问题、我的错误的参考。实数列与国家名称不关联。但我会检查目前为止的所有答案,看看如何更好地利用它们。@LuizJunior下次请发布能够合理地代表真实世界数据的示例。所有的答案都试图解决这个问题,假设国家或州的名称是以某种格式。有些人甚至试图找到内置的数据集或软件包,以便列出州或国家的名称。但似乎你不关心任何国家或州的名称,因为它们不在你的数据中。我真的很抱歉,实际数据不是英文的,我可以翻译,但我担心它不够清楚,所以我创建了一个新的例子。我做错了。我的同位语。你有详尽正确的州和国家列表吗?你如何确定需要进行互换的行?对不起,我用国家作为我的问题、我的错误的参考。实数列与国家名称不关联。但我会检查目前为止的所有答案,看看如何更好地利用它们。@LuizJunior下次请发布能够合理地代表真实世界数据的示例。所有的答案都试图解决这个问题,假设国家或州的名称是以某种格式。有些人甚至试图找到内置的数据集或软件包,以便列出州或国家的名称。但似乎你不关心任何国家或州的名称,因为它们不在你的数据中。我真的很抱歉,实际数据不是英文的,我可以翻译,但我担心它不够清楚,所以我创建了一个新的例子。我做错了。My appologies.Upvote为nice
data.table
解决方案投票,尽管可能存在不在美国的州名。OP说国家和州只是例子,它们不在真实世界的数据集中。所以你的文章是一个展示如何交换列值的好例子。它非常有效!非常感谢。我只需要在DB中用state.name替换实际单词,就像这里的USA一样