2017-08-04 9 views
0

私は1百万の観測値と4つの変数(ID、NAME、COMPANY、TIPS)を持っています ID値は正しくマッピングされていますが、NAME列にはフルネームが含まれ、それぞれのid(2,3,4)の末尾には完全な名前しかないので、idと正しい名前を1つ表示するように、完全な名前をすべてのidに置き換えます。
サンプルデータテーブルとして、以下の(DT - フォーマット)類似の名前から1つのIDに1つの名前を割り当てます。

ID Name      Company Tips 
1 Dave      AB  50 
2 PAT E DAV     ABC  15 
2 PAT ERIN DAV(full name) AB  26 
3 JIL WIRTH     DFG  26 
3 JIL K WIRTH    EF  45 
3 JILL KATH WIRTH(full name) JUI  85 
4 MARIANA PO     KIL  50 
4 MARIANA A PO(full name) LPI  55 
5 BRET      LLC  52 

予想される出力

ID Name     Company Tips 
    1 Dave     AB  50 
    2 PAT ERIN DAV   ABC  15 
    2 PAT ERIN DAV   AB  26 
    3 JIL KATH WIRTH  DFG  26 
    3 JIL KATH WIRTH  EF  45 
    3 JILL KATH WIRTH  JUI  85 
    4 MARIANA A PO   KIL  50 
    4 MARIANA A PO   LPI  55 
    5 BRET     LLC  52 

答えて

2

一つの方法は、IDごとに最長の名前を取ることであろう。ここだけNameName2を変更、新しい値でNameを上書きするにはdplyr ...

library(dplyr) 
df <- df %>% group_by(ID) %>% mutate(Name2=Name[which.max(nchar(Name))]) 

df 
    ID   Name Company Tips   Name2 
    <int>   <chr> <chr> <int>   <chr> 
1  1   Dave  AB 50   Dave 
2  2  PAT E DAV  ABC 15 PAT ERIN DAV 
3  2 PAT ERIN DAV  AB 26 PAT ERIN DAV 
4  3  JIL WIRTH  DFG 26 JILL KATH WIRTH 
5  3  JIL K WIRTH  EF 45 JILL KATH WIRTH 
6  3 JILL KATH WIRTH  JUI 85 JILL KATH WIRTH 
7  4  MARIANA PO  KIL 50 MARIANA A PO 
8  4 MARIANA A PO  LPI 55 MARIANA A PO 
9  5   BRET  LLC 52   BRET 

を使用しての方法です。

0

解決策は、dplyrtidyrの機能を使用します。各IDの最後のIDを使用してNameを埋めます。 dt2が最終出力です。

(full name)が本当にあなたのデータフレームにあり、それを削除したい場合は、gsubと正規表現を使用してそれを行うことができます。 dt3が最終出力です。

# Load packages 
library(dplyr) 
library(tidyr) 

# Create example data frames 
dt <- read.table(text = "ID Name      Company Tips 
1 Dave      AB  50 
       2 'PAT E DAV'     ABC  15 
       2 'PAT ERIN DAV(full name)' AB  26 
       3 'JIL WIRTH'     DFG  26 
       3 'JIL K WIRTH'    EF  45 
       3 'JILL KATH WIRTH(full name)' JUI  85 
       4 'MARIANA PO'     KIL  50 
       4 'MARIANA A PO(full name)' LPI  55 
       5 'BRET'      LLC  52", 
       header = TRUE, stringsAsFactors = FALSE) 


dt2 <- dt %>% 
    group_by(ID) %>% 
    # Replace names that are not on the last row of each ID to be NA 
    mutate(Name = ifelse(row_number() != n(), NA, Name)) %>% 
    # Fill NA with the name from the last row 
    fill(Name, .direction = "up") 

# Remove the string (full name) 
dt3 <- dt2 %>% mutate(Name = gsub("\\s*\\([^\\)]+\\)", "", Name)) 
2

ベースRソリューションは、full nameに基づいてソートして置き換えることです。最後のステップは、(full name)

gsub('\\(.*', '', with(df[order(df$ID, 
       gsub("[\\(\\)]", "", regmatches(df$Name, gregexpr("\\(.*?\\)", 
        df$Name)))),], ave(Name, ID, FUN = function(i) `<-`(i, tail(i, 1))))) 

#[1] "Dave" "PAT ERIN DAV" "PAT ERIN DAV" "JILL KATH WIRTH" "JILL KATH WIRTH" "JILL KATH WIRTH" "MARIANA A PO" "MARIANA A PO" 
#[9] "BRET" 
を削除する gsubです。
関連する問題