2017-09-14 5 views
1

私のデータは次のとおりです。列内の文字に次の行を比較

Name House Street Apt City Postal Phone 
Bob Joe  954 BLUE DRIVE NA A PLACE Z5K4N2 999-495-6544 
Smith Jane 555 BLUE DRIVE NA A PLACE Z5K4N5 999-435-6172 
Smith Jane 555 BLUE DRIVE NA A PLACE Z5K4N5 999-450-6763 

等しく、家#が等しい場合、それぞれの2を連結、私は名前を比較しようとしています(動的に、データがハウスでソートされます)電話番号を削除し、連結されていない行を削除します。

Name House Street  Apt City Postal Phone 
Bob Joe  954 BLUE DRIVE NA A PLACE Z5K4N2 999-495-6544 
Smith Jane 555 BLUE DRIVE NA A PLACE Z5K4N5 999-435-6172 OR 999-450-6763  

私の試み:

だから、この後のようになります

for(x in 1:nrow(data)) { 

    if(data$Name[x] == data$Name[x+1]) { 
    data$NameDupes <- data$Name[x] } 
} 

し、その使用後の

aggregate: aggregate(Phone ~ Name + Street + City + Postal + Apt + House, data = df, paste, collapse = " OR ") 

し、その後、使用上の参加私のオリジナルdf。

おかげ

+0

あなた 'アプト変数は、NASが含まれているためaggregate'コードが失敗しています、グループ化変数として適切に使用することはできません。これを修正するには、これらの値を「NONE」または0などに変更します。たとえば、 'df $ Apt [is.na(df $ Apt)] < - " "'そして最後のコード行は、あなたの例で2行目と3行目を組み合わせて動作します。 – lmo

答えて

2

dplyrから解決策のアイデアにオープン

library(dplyr) 

dt2 <- dt %>% 
    group_by(House, Street, Apt, City, Postal) %>% 
    summarise(Name = first(Name), Phone = paste(Phone, collapse = " OR ")) %>% 
    ungroup() %>% 
    arrange(desc(House)) %>% 
    select(colnames(dt)) 
dt2 
# A tibble: 2 x 7 
     Name House  Street Apt City Postal      Phone 
     <chr> <int>  <chr> <lgl> <chr> <chr>      <chr> 
1 Bob Joe 954 BLUE DRIVE NA A PLACE Z5K4N2     999-495-6544 
2 Smith Jane 555 BLUE DRIVE NA A PLACE Z5K4N5 999-435-6172 OR 999-450-6763 

DATA

dt <- read.table(text = "Name House Street Apt City Postal Phone 
'Bob Joe'  954 'BLUE DRIVE' NA 'A PLACE' Z5K4N2 '999-495-6544' 
'Smith Jane' 555 'BLUE DRIVE' NA 'A PLACE' Z5K4N5 '999-435-6172' 
'Smith Jane' 555 'BLUE DRIVE' NA 'A PLACE' Z5K4N5 '999-450-6763'", 
header = TRUE, stringsAsFactors = FALSE) 
0

@ycwとは異なる答え... data.table使用。 (私はパッケージの個人的なファンなので)。データ

dt <- read.table(text = "Name House Street Apt City Postal Phone 
'Bob Joe'  954 'BLUE DRIVE' NA 'A PLACE' Z5K4N2 '999-495-6544' 
'Smith Jane' 555 'BLUE DRIVE' NA 'A PLACE' Z5K4N5 '999-435-6172' 
'Smith Jane' 555 'BLUE DRIVE' NA 'A PLACE' Z5K4N5 '999-450-6763'", 
header = TRUE, stringsAsFactors = FALSE) 

我々は出力素晴らしいワンライナー

library(data.table) 
dt = as.data.table(dt) 
dt[,.(Phone = paste(Phone,collapse = " OR ")),by = .(Name,House,Street,Apt,City,Postal)] 

を実行を使用して

 Name House  Street Apt City Postal      Phone 
1: Bob Joe 954 BLUE DRIVE NA A PLACE Z5K4N2     999-495-6544 
2: Smith Jane 555 BLUE DRIVE NA A PLACE Z5K4N5 999-435-6172 OR 999-450-6763 
+1

最初はdata.tableを最初に返すために 'fread'を使い始めることができます。または、変換が実行される場合は、 'setDT'が' as.data.table'よりも優先されます。これは、performが変換を実行するため、コピーが作成されないためです。実際には、 'setDT(dt)[']を実行し、コードと同じ行で変換を実行するだけです。 – lmo

+0

@Imoもちろん、問題は可能な限り効率的なdata.tableに変換されませんでした。 – zwep