2016-04-04 26 views
1

/else語句我有一個數據幀如下所示函數應用在數據幀與如果R中

data.1 <- data.frame(
    X1 = 6:10, 
    X2 = 1:5, 
    X3 = c(TRUE,FALSE,TRUE,FALSE,TRUE) 
) 

    X1 X2 X3 
1 6 1 TRUE 
2 7 2 FALSE 
3 8 3 TRUE 
4 9 4 FALSE 
5 10 5 TRUE 

我想創建一個具有以下邏輯新的列X4:

if X3==NULL then X4=NULL 
elseif X3==TRUE then X4=X1+X2 
else X4=X1-X2 

在此先感謝

+0

我試過下面的代碼,它返回錯誤。 data.1 $ X4 <-lapply(data.1,function(x)ifelse(data.1 $ X3 == TRUE,data.1 $ X2-data.1 $ X1,data.1 $ X2 + data.1 $ X1)) – woshishui

+0

請編輯該問題,不要將代碼添加到評論。另外,你說「返回錯誤」,告訴我們錯誤是什麼。不要讓我們輸入所有內容來獲得您應該提供的錯誤信息。你建議在data.frame的單元格中測試'NULL' ...你是否嘗試過在單元格中使用NULL來創建一個data.frame? – r2evans

+0

順便說一句:既然你的'ifelse'按照定義做矢量數學,而你給它的矢量,爲什麼你需要'lapply'? (提示,你沒有。) – r2evans

回答

1

lapply適用於當您的數據是一個列表,這不是你在做什麼。

首先,您不會在data.frame中找到NULL條目。 NA,當然,但不是NULL,所以你應該圍繞is.na()工作。接下來,您不需要測試if(x==TRUE); R知道如何使用if(x)。好吧,這樣做是爲了生意;你是與你的ifelse大部分的方式。您可以將矢量分配給ifelse的輸出,它會照顧矢量化的爲你

data.1$X4 <- ifelse(is.na(data.1$X3), 
        NA, 
        ifelse(data.1$X3==TRUE, 
          data.1$X1+data.1$X2, 
          data.1$X1-data.1$X2)) 

data.1 
## X1 X2 X3 X4 
## 1 6 1 TRUE 7 
## 2 7 2 FALSE 5 
## 3 8 3 TRUE 11 
## 4 9 4 FALSE 5 
## 5 10 5 TRUE 15 

這是醜陋的,但。 dplyr包含非標準評估,其中涉及在名稱空間中搜索列,因此每次要引用列時都不需要引用數據名稱,從而使其更清晰。 dplyr::mutate更改一列。

library(dplyr) 
mutate(data.1, X4 = ifelse(is.na(X3), 
          NA, 
          ifelse(X3, 
            X1+X2, 
            X1-X2))) 

data.1 
## X1 X2 X3 X4 
## 1 6 1 TRUE 7 
## 2 7 2 FALSE 5 
## 3 8 3 TRUE 11 
## 4 9 4 FALSE 5 
## 5 10 5 TRUE 15 
+0

謝謝@Jonathan。兩個答案都運行良好,dplyr:mutate解決方案將使生活更輕鬆。 – woshishui

+0

或使用'with()'來解決命名問題。另外,你不需要明確地測試NA,因爲與NA的比較會給出NA,所以用data.1 ifelse(X3,X1 + X2,X1-X2)給出了一個遠非醜陋的適當結果。 – thelatemail