2017-07-13 39 views
1

我從R中導出它並在Excel中手動添加Segment列後,有一些看起來像這樣的原始數據。根據其他三列中的值設置R列中的值

原始數據拉昇到Excel

Raw Data pulled into excel

我想寫R中的代碼,將添加段我。

數據說明......

ID: Random distinct numbers 
flag: Yes or No 
Period: 0-12 Mths or 12-24 Mths 
Spend Group: High, Medium or Low 

規則...

Flag = Yes 
Period = 0-12 Mths 
Spend Group = High 
Then Segment = G01 

Flag = Yes 
Period = 0-12 Mths 
Spend Group = Medium 
Then Segment = G02 

Flag = Yes 
Period = 0-12 Mths 
Spend Group = Low 
Then Segment = G03 

Flag = Yes 
Period = 12-24 Mths 
Spend Group = High 
Then Segment = G04 

...依此類推,直至所有的變量已經佔到

我想要的代碼在每次處理數據時識別差異,例如,該標誌不總是爲「是」或「否」。有時,每行都爲「是」。

我的完整數據集摘要如下圖所示。

彙總數據

Summary Data

你將如何開始R中的代碼呢?

+1

首先,你希望將其保存爲CSV,然後將其讀入R作爲與數據幀'''DF < - read.csv( 「C:/Users/you/path_to_file/file.csv」)'''。之後,我建議閱讀關於R的教程。這是您要學習的第一件事情之一 – rsoren

+0

Thanks @rsoren。我已經擁有了R中的所有數據,這是處理的最後一步。我不想輸入規則,因爲可能會有比上面顯示的更多的變量。理想情況下,我想爲每個條件創建矢量或類似的東西,並將它們用作規則的主幹,例如flag < - c(「Yes」,「No」),recency < - c(「0-12 Mths 「,」12-24 Mths「)等。你能推薦一個教程。 –

+1

你嘗試過什麼嗎?一個用戶陣營可能會建議使用'dplyr'管道,而另一些陣營則會使用'data.table'示例進行反擊。它也可以在R中直接進行,可能使用'ifelse'或其他基於向量的操作。首先,如果我們有一些數據可以使用,那麼製作一些東西就簡單多了,而且我不傾向於從圖像中轉錄。在[help/mcve](https://stackoverflow.com/help/mcve)和[一個受歡迎的q/a](https://stackoverflow.com/a/5963610/3358272)上編寫好的問題有很好的建議。 。 – r2evans

回答

0

爲了擴大我上面的評論(抱歉我很急),我建議讓你的規則在csv中(或者只是定義爲一個數據框架,但是如果他們要改變csv可能是最簡單的)並將它們作爲單獨的數據框讀取,例如下面的內容。這可以將標誌,句點和花費組的組合與要分配給每個組合的段相結合。

假設你的數據(與colnames 「Unique.ID」, 「標誌」, 「時間段」, 「spend_group」)是在DF

library(dplyr) 
df_withSegment <- left_join(df, rules) 

爲 「標誌」, 「時間段」,「spend_group 「是所有具有通用名稱的列,它將規則中的段的值分配給這三列的每個組合。

規則,例如數據幀(來自CSV或R)

enter image description here

+0

這個工作完美... finaldf < - left_join(df,Rules,by = c(「Flag」=「Flag」,「Period」= Period「,」SpendGroup「=」SpendGroup「)) 大家。 –

0

我會用四步ifelse()做到這一點。

你的四個子集Flag == "yes" & Recency == "0-12 Mths"Flag == "yes" & Recency == "12-24 Mths"Flag == "no" & Recency == "0-12 Mths"Flag == "no" & Recency == "12-24 Mths"並推出ifelse()調用中引用您的數據:

mydata$Segment[mydata$Flag == "yes" & mydata$Recency == "0-12 Mths"] <- with(mydata[mydata$Flag == "yes" & mydata$Recency == "0-12 Mths", ], 
    ifelse(Spend Band == "High", "G01", 
    ifelse(Spend Band == "Medium", "G02", "G03"))) 

mydata$Segment[mydata$Flag == "yes" & mydata$Recency == "12-24 Mths"] <- with(mydata[mydata$Flag == "yes" & mydata$Recency == "12-24 Mths", ], 
    ifelse(Spend Band == "High", "G04", 
    ifelse(Spend Band == "Medium", "G05", "G06"))) 

mydata$Segment[mydata$Flag == "no" & mydata$Recency == "0-12 Mths"] <- with(mydata[mydata$Flag == "no" & mydata$Recency == "0-12 Mths", ], 
    ifelse(Spend Band == "High", "G07", 
    ifelse(Spend Band == "Medium", "G08", "G09"))) 

mydata$Segment[mydata$Flag == "no" & mydata$Recency == "12-24 Mths"] <- with(mydata[mydata$Flag == "no" & mydata$Recency == "12-24 Mths", ], 
    ifelse(Spend Band == "High", "G10", 
    ifelse(Spend Band == "Medium", "G11", "G12"))) 

你將不得不改變變量名,爲Spend Band不是R中一個可行的變量名,因此我猜你的名字叫做Spend_Band或類似的東西。

+1

使用dplyr :: left_join()獲取數據並給出分段 – user2738526

+0

可能更容易製作一個單獨的數據框,但不幸的是,我不太熟悉dplyr。 – LAP

+0

感謝您的評論。看到上面的數據鏈接。我想我需要玩一些類似@abishek提供的答案,因爲每次數據加載時我的值可能會發生變化,並且使用字段名稱而不是爲每個結果寫入值會考慮到這一點。只是不知道該怎麼做! –

1

在我頭頂合併似乎是正確的方式。 (raw_data,summary_data,by.x = c(「flag」,「period」,「cost_group」),by.y = c(「flag」,「recency」,「spend_band」))

+0

@Super_Si慷慨地接受答案,如果它對您有幫助 –

+0

請參閱上面的數據鏈接。我想我需要玩這樣的事情,因爲每次數據加載時我的值可能會發生變化,並且使用字段名稱而不是爲每個結果寫入值會考慮到這一點。只是不知道該怎麼做! –

相關問題