2016-07-06 86 views
0

第一的數據,那麼我的問題:如何根據R中的2個條件分配一個值?

df <- data.frame(Z=c(1,2,3),Y=c(2,3),A=c(1,2,3,4,5,6)) 
df 
Z Y A 
1 2 1 
2 2 2 
3 2 3 
1 3 4 
2 3 5 
3 3 6 

我使用R和想生成的載體與給定的矢量ZY。就像如果(z1==1 & y1==2),然後a1=1,如果(z3==3 & y1==2),然後a1=3 ....如果我們只有一個條件(ZY),我可能會產生A帶開關功能,但是,我怎麼會產生AZY

回答

0

如果我正確理解了這個問題,答案如下。如果我誤解了,請糾正我。

df <- data.frame(Z=c(1,2,3),Y=c(2,3),A=c(1,2,3,4,5,6)) 

df$A <- NA # Empty out A 
# Re-create A 
df$A[df$Z == 1 & df$Y == 2] <- 1 
df$A[df$Z == 2 & df$Y == 2] <- 2 
df$A[df$Z == 3 & df$Y == 2] <- 3 
df$A[df$Z == 1 & df$Y == 3] <- 4 
df$A[df$Z == 2 & df$Y == 3] <- 5 
df$A[df$Z == 3 & df$Y == 3] <- 6 

df <- df[order(df$A),] 
df 
Z Y A 
1 1 2 1 
5 2 2 2 
3 3 2 3 
4 1 3 4 
2 2 3 5 
6 3 3 6 
+0

我不明白爲什麼OP想要再次產生已經存在的輸出。 –

+0

@ChirayuChamoli可能他們想展示預期的產出。 – zx8754

+0

@ zx8754是的,但我甚至無法理解預期輸出的邏輯。 –

0

另一種方式來做到這一點在一個呼叫是使用ifelse功能如下:

df <- data.frame(Z=c(1,2,3),Y=c(2,3),A=c(1,2,3,4,5,6)) 

df$A <- ifelse(df$Z == 1 & df$Y == 2,1, 
       ifelse(df$Z == 3 & df$Y == 2,3, 
         ifelse(df$Z > 1,5,8))) 

    Z Y A 
1 1 2 1 
2 2 3 5 
3 3 2 3 
4 1 3 8 
5 2 2 5 
6 3 3 5 
0

隨着條件的數量的增加,如果你只是希望在完全匹配的情況下,使用結果查找表併合並它們變得更加有用。所以我們先從查找表你

df.lookup <- data.frame(Z=c(1,2,3),Y=c(2,3),A=c(1,2,3,4,5,6)) 

定義它,讓我們說,我們有一個數據幀,我們要填充

set.seed(17) # To get repeatable random numbers 
df <- data.frame(Z=sample(1:3, 6, replace=T), Y=sample(2:3, 6, replace=T)) 

因此,我們必須

> df 
    Z Y 
1 1 2 
2 3 2 
3 2 3 
4 3 2 
5 2 2 
6 2 2 
> merge(df, df.lookup) 
    Z Y A 
1 1 2 1 
2 2 2 5 
3 2 2 5 
4 2 3 2 
5 3 2 3 
6 3 2 3 

merge函數將自動選擇相同名稱的列,但如果名稱不同,則可以指定名稱,請參閱?merge以獲取更多信息。

相關問題