如何根据R中的2个条件指定值?

时间:2016-07-06 11:38:00

标签: r switch-statement

首先是数据,然后是我的问题:

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生成向量a。就像(z1==1 & y1==2),然后a1=1(z3==3 & y1==2)a1=3 ....如果我们只有一个条件(ZY ),我可以使用切换功能生成A,但是,如何使用AZ生成Y

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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