簡體   English   中英

在 R 中,如何根據條件將列中的值替換為另一個數據集的另一列的值?

[英]In R, how to replace values in a column with values of another column of another data set based on a condition?

我必須數據集,我在下面給出的樣本。 我需要替換target_df$project_name中的項目名稱,以防它們出現在registry_df$to_change中,並使用registry_df$replacement $replacement 中的相應值。 但是,我嘗試的代碼顯然沒有提供任何結果。 應該如何糾正或有什么其他方式來實現預期的目標?

數據集:

target_df <- tibble::tribble(
  ~project_name,     ~sum,   
  "Mark",            "4307",     
  "Boat",            "9567",       
  "Delorean",        "5344",      
  "Parix",           "1043",
)

registry_df <- tibble::tribble(
  ~to_change,     ~replacement,   
  "Mark",            "Duck",     
  "Boat",            "Tank",       
  "Toloune",         "Bordeaux",      
  "Hunge",           "Juron",
)

target_df 的所需 output:

project_name        sum   
  "Duck"            "4307"     
  "Tank"            "9567"       
  "Delorean"        "5344"      
  "Parix"           "1043"

代碼:

library(data.table)

target_df <- transform(target_df, 
                       project_name = ifelse(target_df$project_name %in% registry_df$to_change),
                       registry_df$replacement,
                       project_name
)

dplyr解決方案。 可能有一種優雅的方式,步驟更少。

library(dplyr)

target_df <- target_df %>% 
  left_join(registry_df,  
            by = c("project_name" = "to_change")) %>% 
  mutate(replacement = ifelse(is.na(replacement), project_name, replacement)) %>% 
  select(project_name = replacement, sum)

結果:

# A tibble: 4 × 2
  project_name sum  
  <chr>        <chr>
1 Duck         4307 
2 Tank         9567 
3 Delorean     5344 
4 Parix        1043

基本 R 解決方案:您可以使用match function 匹配列。 由於並非所有級別的target_df$project_name都在registry_df$to_change中,因此您的匹配變量將具有NA 因此,我包括了ifelse function 在NA s 的情況下保持原始值。

matching <- registry_df$replacement[match(target_df$project_name, registry_df$to_change)]
target_df$project_name <- ifelse(is.na(matching),
                                 target_df$project_name,
                                 matching)

target_df給出了預期的 output:

  project_name sum  
  <chr>        <chr>
1 Duck         4307 
2 Tank         9567 
3 Delorean     5344 
4 Parix        1043 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM