2017-09-26 49 views
-1

中的R數據幀的新列我有以下dataframe-稱它爲創建基於現有列和一組參數

S.No Action Taken 
1 Advance Booking 
2 Before Launch 
3 After Launch 
4 Re Launch 
5 Customer care management 

我也有以下數據幀 - 呼叫過b

Sl No Action Name 
1  Machine Re Launch 
2  New Machine Re Launch 
3  New Machine Relaunch 
4  New Device Launch 
5  New Device After Launch 
6  Customer Care Management' 
7  Machine After Launch 
8  New Machine After Launch 
9  New Machine Relaunch 
10  New Device After Launch 

如何創建數據集B中的列如下 -

Sl No Action Name    Action Type 
1  Machine Re Launch   Re Launch 
2  New Machine Re Launch  Re Launch 
3  New Machine Relaunch  Re Launch 
4  New Device Launch   Launch 
5  New Device After Launch  After Launch 
6  Customer Care Management' Customer Care Management 
7  Machine After Launch  After Launch 
8  New Machine After Launch After Launch 
9  New Machine Relaunch  After Launch 
10  New Device After Launch After Launch 

我如何做到這一點。這與在Excel中查找類似。

+2

負責修剪「動作名稱」的算法是什麼?你有什麼嘗試?考慮發佈一個[可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 –

+0

操作名稱是作爲數據字典的一部分提供的 - 我沒有通過任何代碼推導出它。我試過了Strsplit,但是它的結果是有限的,因爲在某些情況下,字典中的關鍵字來自字符串之間。它看起來像查找,但我到目前爲止只能找到數字示例。因此我的查詢 –

回答

0

是否由於您的示例中的拼寫錯誤,B數據框將其拼寫爲「重新啓動」,但A表示「重新啓動」?沒有任何進一步的信息,我不明白你期望它如何匹配那兩個。

假設這是一個錯誤,你可以做這樣的事情,

B$action_type <- "" 
for (i in A$action_taken) { 
    B$action_type <- ifelse(B$action_type == "", 
             ifelse(grepl(i, 
                B$action_name, 
                ignore.case = TRUE), 
              i, 
              ""), 
             B$action_type) 
} 

這只是通過採取列表中的動作迭代,查找是否發現在操作名稱的文本,如果這樣做,那麼它將輸出爲Action Type(如果不是,則將其保留爲空並移至下一個字符串)。這隻能找到確切的拼寫(忽略大小寫),所以「重新啓動」和「重新啓動」不匹配。

編輯

添加新的回覆以反映下面的評論。

如果你想能夠處理所有版本的「重新啓動」/「重新啓動」等,我認爲你必須做一個你期望的所有變化的查找表,以及他們相應的正確的「採取行動」在第二列。

所以A數據框現在有兩列action_text_variationACTION_TAKEN,其中action_text_variation擁有所有文本查找,並ACTION_TAKEN有您要填寫「ACTION_TYPE」配合相應文字。

現在我們在A.

B$action_type <- "" 
for (i in 1:nrow(A)) { 
    B$action_type <- ifelse(B$action_type == "", 
             ifelse(grepl(A$action_text_variation[i], 
                B$action_name, 
                ignore.case = TRUE), 
              A$action_taken[i], 
              ""), 
             B$action_type) 
} 

附註:通過行數迭代如果您發佈了一個可重複的示例,那麼幫助您會容易得多,因此我們可以自行運行代碼並提出更改建議。

+0

謝謝。它實際上不是一個拼寫錯誤,但我可以再次替換正確的版本。我被要求避免R中的循環,因爲它們可能有問題。 –

+0

for循環在R中肯定會有問題,但我認爲如果你明白爲什麼它們是一個問題(如避免將for循環輸出附加到數據框),那麼可以避免它。但它們本質上並不壞並有其用途。這並不是說沒有更好的非循環方式來解決你的問題:)但這是我該怎麼做。 我會編輯原始回覆以反映您可以處理重新啓動以及「重新啓動」的問題。 –

+0

親愛的主席先生。謝謝。有沒有教程/資源循環和控制語句。我已經學會了基本的知識,但是得到更大的循環。 –