2017-09-25 110 views
-5

我有一個數據幀DF與列ID,X和Y創建發生變異的新列根據條件值

ID = c(1,1,2,2) 
X = c(1,0.4,0.8,0.1) 
Y = c(0.5,0.5,0.7,0.7) 
df <- data.frame(ID,X,Y) 

ID X Y 
1 1.0 0.5 
1 0.4 0.5 
2 0.8 0.7 
2 0.1 0.7 

我想獲得兩個新的列:

  • 當X大於Y時Xg等於X並且否則爲NA
  • Xl等於當X小於Y時爲X,否則爲NA。也就是說,

    ID X Y Xg Xl 
    1 1.0 0.5 1.0 NA 
    1 0.4 0.5 NA 0.4 
    2 0.8 0.7 0.8 NA 
    2 0.1 0.7 NA 0.1 
    
+1

閱讀關於'ifelse'? – zx8754

+1

你說你有一個數據框,但你綁定你的數據作爲data.table。你的意思是'df < - data.frame(ID,X,Y)'?或者你在尋找一個data.table解決方案? – dshkol

+0

@dshkol由於它沒有在data.tables中看到通常的'1:',所以我將其編輯爲data.frame。 – Frank

回答

2

下面應該工作,即使有NA在XY

library(dplyr) 
df %>% 
    mutate(Xg = ifelse(X > Y, X, NA), 
     Xl = ifelse(X < Y, Y, NA)) 

如果你想使用if_elsedplyr,你必須NA轉換爲數值。 if_else是在於它檢查TRUEFALSE值是否是相同類型的比ifelse嚴格:

df %>% 
    mutate(Xg = if_else(X > Y, X, as.numeric(NA)), 
     Xl = if_else(X < Y, Y, as.numeric(NA))) 

結果:

ID X Y Xg Xl 
1 1 1.0 0.5 1.0 NA 
2 1 0.4 0.5 NA 0.5 
3 2 0.8 0.7 0.8 NA 
4 2 0.1 0.7 NA 0.7 
5 3 NA 1.0 NA NA 
6 3 3.0 NA NA NA 

數據:

ID = c(1,1,2,2,3,3) 
X = c(1,0.4,0.8,0.1,NA,3) 
Y = c(0.5,0.5,0.7,0.7,1,NA) 
df <- data.frame(ID,X,Y) 
+0

你可以使用'NA_real_'而不是'as.numeric(NA)' –

+0

@OttToomet確實,'as.numeric()'正在轉換'NA'無論如何。 (「相同(as.numeric(NA),NA_real_)」 – useR

2

什麼關於一些普通的舊R索引和子集?

ID <- c(1,1,2,2, 3, 3) 
X <- c(1,0.4,0.8,0.1, NA, 2) 
Y <- c(0.5,0.5,0.7,0.7, 2, NA) 
Xg <- Xl <- rep(NA_real_, length(ID)) 
Xg[which(X > Y)] <- X[which(X > Y)] 
Xl[which(X < Y)] <- X[which(X < Y)] 
data.frame(ID, X, Y, Xg, Xl) 

注:我假設如果X或Y缺失,Xg和Xl應該是NA。

1

爲了完整起見,併爲這個問題原本是用來data.table()編輯之前(因爲我喜歡簡潔的代碼)這裏是「一個班輪」的地方使用data.table更新:

library(data.table) 
setDT(df)[X > Y, Xg := X][X < Y, Xl := X][] 
ID X Y Xg Xl 
1: 1 1.0 0.5 1.0 NA 
2: 1 0.4 0.5 NA 0.4 
3: 2 0.8 0.7 0.8 NA 
4: 2 0.1 0.7 NA 0.1 
5: 3 NA 1.0 NA NA 
6: 3 3.0 NA NA NA 

(使用的useR數據)

NA是自動處理的,因爲只有匹配的行被更新。