用另一列替换一列的值

尹贤秀

用另一列替换一列的值我正在处理数据集的预处理过程。这是我的数据集的概述

  BSTN ASTN  
  150   216
  300   222
  4310  35
   60  4310 
  150   23
  4310  60
   .     .
   .     . 
   .     .

数字 BSTN ASTN 表示站的代码编号我有另一个 BSTN 数据集,ASTN 数字显示站号。这是它的样子

  Station code Station  
  150             A
  300             A
  4310            B
   23             C
   60             C 

   .              .
   .              . 
   .              .

问题是有些站有两个或多个代码。例如站 A 的站号是 150, 300

我想将BSTN和ASTN中具有多个站号的站号统一为一个统一的站号。我也想把BSTN、ASTN中的代码编号统一成一个频率更高的数字

  BSTN ASTN  
  150   216
  150   222
  4310  35
   60  4310 
  150   60
  4310  60
   .     .
   .     . 
   .     .

我想要的最终输出如下所示。

我将不胜感激

大卫·T

让我们输入您的数据

library(readr)    
stations <- read_table(
  "BSTN  ASTN  
  150   216
  300   222
 4310    35
   60  4310 
  150    23
 4310    60")

stCodex <- read_table(
  "Station_code Station  
  150             A
  300             A
  4310            B
   23             C
   60             C "
)

让我们把两列放在一个小标题中,这样我们就可以找出每个站最受欢迎的 Station_code

st2 <- tibble(replaceBy = c(stations$BSTN, stations$ASTN)) %>% 
  left_join(stCodex, by = c("replaceBy" = "Station_code")) %>% 
  filter(!is.na(Station)) %>% 
  group_by(Station, replaceBy) %>% 
  summarise(Count = n()) %>% 
   # We have a count of each Station's Station_codes.  Find the most frequent
  mutate(BestCount = max(Count)) %>% 
  filter(Count == BestCount) %>% 
  summarise_all(~ first(.)) %>% 
  arrange(Station) %>% 
  select(Station, replaceBy)

看起来像:

# A tibble: 3 x 2
  Station replaceBy
  <chr>       <dbl>
1 A             150
2 B            4310
3 C              60

建立一个替换表 - 用较高的替换低频的 Station_codes。

rplc <- stCodex %>% 
  left_join(st2, by = "Station") %>% 
  filter(Station_code != replaceBy) %>% 
  select(- Station)

给予

# A tibble: 2 x 2
  Station_code replaceBy
         <dbl>     <dbl>
1          300       150
2           23        60 

进行替换 - 首先在 BSTN,然后在 ASTN

stations %>% 
  left_join(rplc, by = c(BSTN ="Station_code")) %>% 
  mutate(BSTN = ifelse(is.na(replaceBy), BSTN, replaceBy)) %>% 
  select(- replaceBy) %>% 
  left_join(rplc, by = c(ASTN ="Station_code")) %>% 
  mutate(ASTN = ifelse(is.na(replaceBy), ASTN, replaceBy)) %>% 
  select(- replaceBy)

答案是

# A tibble: 6 x 2
   BSTN  ASTN
  <dbl> <dbl>
1   150   216
2   150   222
3  4310    35
4    60  4310
5   150    60
6  4310    60

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章