2015-05-11 43 views
0

爲了我的搜索的最佳狀態,以前沒有問過這個問題。 我有一個名爲Product的數據框列。本專欄僅列出一個公司名稱和產品型號。使用字符串比較來拆分R中的列

product.df <- data.frame("Product" = c("Company1 123M UG", "Company1 234M-I", "Company2 763-87-U","Company2 777-87", "Company3 Name1 87M", "Company3 Name1 O77M", "Company3 Name1 765-U MP")) 

我想將公司名稱和產品型號從這一列拆分爲兩列。我需要一個可以在行之間找到類似單詞的函數,並將它們分類爲公司名稱和其餘字母作爲產品型號。據我所知,沒有兩行有相同的型號。所以在上面的情況。我會得到這樣的回答

new.product.df <- data.frame("CompanyName" = c("Company1", "Company1", "Company2","Company2", "Company3 Name1", "Company3 Name1", "Company3 Name1"), "Model" = c("123M UG", "234M-I", "763-87-U", "777-87", "87M", "O77M", "765-U MP")) 

我需要一個可以比較兩個字符串,並返回我類似的連續字母和字母不同的功能。

+0

什麼*「比較兩個字符串並返回類似的連續字母和不相似的字母」*?請舉個例子。你想要提取模型名稱/數字,並進行比較?哪一個? *「Company3 Name1 87M」*的預期輸出是什麼?它是*「Name1 87M」*,*「1 87M」*還是*「87M」*? – smci

+0

如何知道'Name1'是公司名稱的一部分還是模型名稱的開頭? – nicola

+0

說*「將公司名稱和產品型號從這一列分成兩列」*非常不清楚 - 哪一列是產品名稱*「Name1」*是否進入?你真的需要舉例。 – smci

回答

0

如果你保證第一個字始終是公司名稱,然後簡單地做,最大2輸出的第一個固定的空間分割:

require(stringi) 
stri_split_fixed(product.pd[,1], ' ', n=2) 

或:

apply(product.df, 2, function(...) { stri_split_fixed(..., ' ', n=2) }) 

[1] "Company1" "123M UG" 
[1] "Company1" "234M-I" 
[1] "Company2" "763-87-U" 
[1] "Company2" "777-87" 
[1] "Company3" "Name1 87M" 
[1] "Company3" "Name1 O77M" 
[1] "Company3" "Name1 765-U MP" 
+0

對於downvoter,這是一個正確的答案。請解釋你的不同意見是什麼? – smci

+5

這不是他想要的輸出(順便說一句,我沒有downvote)。 'Name1'部分應該留在第一列。 – nicola

+0

@nicola:如果您確信自己明白*「清楚地將公司名稱和產品型號從這一列分爲兩列」*,那麼請告訴我們它的含義?產品名稱*「Name1」*進入哪一列? OP真的需要舉例。 – smci

0

嘗試這

new.product.df <- data.frame(company= 
    unlist(lapply(strsplit(as.character(product.df$Product), split=" .[0-9]"), function(x) x[1])), 
    name = 
    unlist(lapply(strsplit(as.character(product.df$Product), split="[1|2] "), function(x) x[2])) 
) 
0

根據您的數據的公司和產品之間的分隔符是第一space字符,所以我們需要將第一步space字符轉換爲其他字符,在本例中爲__,稍後我會告訴您爲什麼我們需要這樣做。

這是你的實際數據

   Product 
1  Company1 123M UG 
2   Company1 234M-I 
3  Company2 763-87-U 
4   Company2 777-87 
5  Company3 Name1 87M 
6  Company3 Name1 O77M 
7 Company3 Name1 765-U MP 

這個代碼做這種轉換

product.df$Product <- sub(product.df$Product , pattern = " " , replacement = "__" , 
perl = T) 

的數據應該是這樣的

   Product 
1  Company1__123M UG 
2   Company1__234M-I 
3  Company2__763-87-U 
4   Company2__777-87 
5  Company3__Name1 87M 
6  Company3__Name1 O77M 
7 Company3__Name1 765-U MP 

然後使用tidyr庫分開這個新的數據幀

library("tidyr") 
new.product.df <- separate(product.df , Product , c("Company" , "Model") , sep = "__") 

背後space字符轉換爲__的原因是,公司的名稱也可以包括space性格像公司123M UG & Name1 87M,這將導致錯誤後因此在這個解決方案的第一步是要避免這種情況以後分開列時。

當然會更好,如果我們對 space字符中第一次出現分離的

,但我不知道如何因爲全球改性劑通過默認分隔符正則表達式導通,從而任何建議,歡迎