2016-07-06 85 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以获取更多信息。

相关问题