R 根据关系分配类别
假设我有一个数据集:R 根据关系分配类别,r,R,假设我有一个数据集: X Y 1 0 500 2 125 375 3 250 250 4 375 125 5 500 500 6 750 250 .... .... 可通过以下方式生成: df <- data.frame(X = c(0,125,250,375,500,750), Y=c(500,375,250,125,500,250)) 所以本质上,我是根据X和Y的比率分配标签:0,0.25,0.75,1。 所以我希望的最终结果是: X Y C
X Y
1 0 500
2 125 375
3 250 250
4 375 125
5 500 500
6 750 250
....
....
可通过以下方式生成:
df <- data.frame(X = c(0,125,250,375,500,750), Y=c(500,375,250,125,500,250))
所以本质上,我是根据X和Y的比率分配标签:0,0.25,0.75,1。
所以我希望的最终结果是:
X Y Category
1 0 500 A
2 125 375 B
3 250 250 C
4 375 125 D
5 500 500 C
6 750 250 D
....
....
我应该如何做到这一点?谢谢使用
ifelse
> transform(df, Category=ifelse(X==0, "A",
ifelse(Y>X & Y/X==3, "B",
ifelse(X==Y, "C", "D"))))
X Y Category
1 0 500 A
2 125 375 B
3 250 250 C
4 375 125 D
5 500 500 C
6 750 250 D
使用
数据表
包
library(data.table)
df <- data.table(X = c(0,125,250,375,500,750), Y=c(500,375,250,125,500,250))
# if X=0, then assign label A
df[X ==0, Label := "A"]
# if Y>X and Y/X=3 then assign label B
df[Y > X & Y/X == 3, Label := "B"]
# if X=Y then assign label C
df[Y == X, Label := "C"]
# if X>Y and X/Y=3 then assign label D
df[X > Y & X/Y == 3, Label := "D"]
# X Y Label
# 1: 0 500 A
# 2: 125 375 B
# 3: 250 250 C
# 4: 375 125 D
# 5: 500 500 C
# 6: 750 250 D
或者使用标准的
data.frame
s
df <- within(df, {
label <- NA
label[X == 0] <- "A"
label[Y > X & Y/X == 3] <- "B"
label[Y == X] <- "C"
label[X > Y & X/Y == 3] <- "D"
})
df到目前为止您尝试了什么?请分享您尝试过的一些代码,而不仅仅是要求我们为您编写…@Oliver注意,第6行不符合条件3,因此我不能被标记为C,而是D。我尝试过,但没有成功,使用ratio=df$X/df$Y,然后使用plyr的mapvalues()将从(Inf,1,3)映射到A,B,C。然而,当比率涉及浮点时,这种方法失败。例如,X=250,Y=375。@Jilber,这是个错误,我的错,应该是D。我认为你的比率——0,0.25,0.75,1——与你的描述(0,1/3,1,3)不匹配;如果你只有正值(看起来是…),那么你的不等式是多余的。如果数据实际上很大,三重嵌套的ifelse
调用可能会非常慢。看看。ifelse的有趣用法。我学到了一些东西。Codoremifa的数据表方法似乎使数值关系更加明确。谢谢
df[, Label := ifelse( X > Y & X/Y == 3, "D",
ifelse(Y == X,"C",
ifelse(Y > X & Y/X == 3, "B", "A"
)
)
)
]
df <- within(df, {
label <- NA
label[X == 0] <- "A"
label[Y > X & Y/X == 3] <- "B"
label[Y == X] <- "C"
label[X > Y & X/Y == 3] <- "D"
})