交换R中放错的单元格?
我有一个巨大的数据库(超过6500万行),我注意到一些单元格放错了位置。举个例子,假设我有:交换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
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一样