2016-05-29 51 views
1

我想根據我的數據框中的幾個條件對數據進行分組。目前我正在用一個效用函數來做這件事,然後我循環,但是因爲R是矢量化的,我想知道是否有更像R的方法來做到這一點?如何在使用條件語句時利用R矢量化? (替代循環)

Items.Ordered <- CMdata$Items.Ordered 

orderGroup <- function(Items.Ordered) { 
    Items.Ordered <- as.numeric(Items.Ordered) 

    if (CMdata$Items.Ordered == 0) { 
    return ("NONE") 
    } else if (CMdata$Items.Ordered > 0 & CMdata$Items.Ordered <= 3) { 
    return ("SMALL") 
    } else if (CMdata$Items.Ordered > 3 & CMdata$Items.Ordered <= 8) { 
    return ("MEDIUM") 
    } else if (CMdata$Items.Ordered > 8) { 
    return ("LARGE") 
    } else { 
    return ("OTHER") 
    } 
} 


Order.Type <- NULL 
for (i in 1:nrow(CMdata)) { 
    Order.Type <- c(Order.Type, orderGroup(CMdata[i,"Items.Orderd"])) 
} 
CMdata$Order.Type <- as.factor(Order.Type) 
+0

看看'之開關。這可能會更清潔一些。 – lmo

回答

1

我不認爲你的程序按預期工作。 您將單個值傳遞給orderGroup函數, 不是矢量, 並且條件對於矢量無效。

我想你真正的意思是這樣的:

orderGroup <- function(value) { 
    if (value == 0) { 
    "NONE" 
    } else if (value > 0 & value <= 3) { 
    "SMALL" 
    } else if (value > 3 & value <= 8) { 
    "MEDIUM" 
    } else if (value > 8) { 
    "LARGE" 
    } else { 
    "OTHER" 
    } 
} 

而爲了讓這個功能更強大, 代替循環,你可以使用sapply,像這樣:

CMdata$Order.Type <- as.factor(sapply(CMdata$Items.Ordered, orderGroup)) 
+0

我注意到,我跑了字符串,它沒有按預期工作。感謝您的幫助,您的答案完美無缺! – Davis

0

一種可能解決方法是在列上執行cut,然後根據每個值落入的範圍重新標記因子。例如:

假設你CMdata包含列如下:

CMdata 
    Items.Ordered 
1    NA 
2    0 
3    1 
4    2 
5    3 
6    4 
7    5 
8    6 
9    7 
10    8 
11    9 
12   10 
13   NA 

可以cutfactor它根據您的條件:

CMdata$Order.Type <- factor(cut(CMdata$Items.Ordered, breaks = c(-Inf, 0, 3, 8, Inf)), 
          exclude = NULL, 
          labels = c("NONE", "SMALL", "MEDIUM", "LARGE", "OTHER")) 
CMdata 
    Items.Ordered Order.Type 
1    NA  OTHER 
2    0  NONE 
3    1  SMALL 
4    2  SMALL 
5    3  SMALL 
6    4  MEDIUM 
7    5  MEDIUM 
8    6  MEDIUM 
9    7  MEDIUM 
10    8  MEDIUM 
11    9  LARGE 
12   10  LARGE 
13   NA  OTHER