2016-07-27 25 views
1

我有一個名爲Cat的數據框。我有多個列。在一個名爲 Jan.15_Transaction的向量中,我有值。我想應用一個條件,如果值大於0,那麼1 else 0.所以我不想使用if else條件,因爲有42列與我想要應用相同的邏輯類似。在數據框中應用函數

Jan.15_Transaction Feb.15_Transaction 
1       1  
2       2 
3       3 
4       4 

因此,我建立這個功能

myfunc <- function(x){ 
if(x > 0){ 
    x=1 
} 
else { 
    x=0 
} 
return(x) 
} 

只有當我使用此代碼這是越來越施加到第一個元素。

Cat$Jan.15_Transaction.1<-myfunc(Cat$Jan.15_Transaction) 

警告消息: 在如果(X> 0){: 條件具有長度> 1且僅第一個元素將被用來

所以,我試圖sapply並得到下面

這個錯誤
sapply(Cat$Jan.15_Transaction.1, myfunction(Cat)) 

錯誤match.fun(FUN):參數 「FUN」 缺失,沒有默認設置

+0

也許'cbind(mydf,as.numeric(mydf [,mySubsetofColumns]> 0))'? – zx8754

+0

請將錯誤消息添加到您的帖子。 – zx8754

回答

2

可以使用ifelse本功能離子vectorise(=跨載體適用)的if聲明:

myfunc = function (x) 
    ifelse(x > 0, 1, 0) 

或者,你可以使用它更有效(但不讀)以下:

myfunc = function (x) 
    as.integer(x > 0) 

再回到原來的功能,你的寫作方式非常不像R。更R類似的實現應該是這樣的:

myfunc = function (x) 
    if (x > 0) 1 else 0 

- 不需要一個臨時變量賦值,或return聲明。

+0

感謝魯道夫。它有助於。我有42列,我想用這個我的功能。是否有辦法選擇這些特定的列,應用該函數並通過在同一數據框中創建單獨的向量來顯示結果。 – Ashish

+0

如果所有的列都是數字,你可以在整個data.frame上使用ifelse,比如'ifelse(dat> 0,1,0)'。否則看看'apply' – Rentrop

1

我假設你想要在名稱以'_Transaction'結尾的列上應用該函數。這可以使用基本功能grepl完成。

vars <- grepl('_Transaction', names(df)) 
df[, vars] <- ifelse(df[, vars] > 0, 1, 0) 

您也可以使用dplyr,如下所示。這也會推廣到更復雜的功能。

binarizer <- function(x) ifelse(x > 0, 1, 0) 

df <- bind_cols(
    df %>% select(-ends_with('_Transaction')), 
    df %>% select(ends_with('_Transaction')) %>% 
    mutate_each(funs(binarizer)) 
) 
+0

錯誤:找不到函數「bind_cols」我找不到bind_cols – Ashish

+0

'bind_cols'函數是'dplyr'包的一部分。 – Rithwik