首先是数据,然后是我的问题:
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并希望使用给定的向量Z
和Y
生成向量a。就像(z1==1 & y1==2)
,然后a1=1
,(z3==3 & y1==2)
,a1=3
....如果我们只有一个条件(Z
或Y
),我可以使用切换功能生成A
,但是,如何使用A
和Z
生成Y
?
答案 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
。