我有以下数据框:
ID C1 C2
1 0 100
2 29 0
3 0 0
4 789 400
我想表明" Type"基于列" C1"和" C2。"例如,如果C1和C2都等于0(或NA),则它是"类型1。"如果C1!= 0且C2 = 0(或NA),那么它是"类型2。" 类型3 - > C1 = 0(& NA),C2!= 0 类型4 - > C1!= 0和C2!= 0
输出应该如下所示:
Type
Type 4
Type 2
Type 1
Type 3
我尝试了几种不同的方式:
for (i in 1:nrow(df))
{
if
((is.na(df[i,12]) == TRUE) | (df[i,12] == 0.00) &
(is.na(df[i,13]) == TRUE) | (df[i,13] == 0.00))
{
df2[i,1] = "Type 1"
}
else
{
df2[i,1] = "Other Type"
}
}
我没有包含上述for循环中的所有条件,但它确实很慢。
这是我尝试的另一种方法(不是完整的代码,只是尝试):
ifelse((is.na(Test_Customer[,2]) | Test_Customer[,2]==0), "Type 1", "Type 2")
对于ifelse语句,我猜测我必须将其包装到函数中,然后使用apply函数将其应用于数据帧的所有行。但是,R是否采用嵌套的ifelse语句,如" if" excel中的陈述?
如果有人知道另一种方法,那就太棒了!非常感谢提前!!
答案 0 :(得分:1)
使用interaction
将数据转换为1/0
后,您可以使用sign
到达那里:
factor(do.call(interaction,sign(dat[-1])),labels=paste("Type",c(1,2,4,3)))
#[1] Type 4 Type 2 Type 1 Type 3
#Levels: Type 1 Type 2 Type 4 Type 3
这将显示编码所指的内容:(C1.C2值):
do.call(interaction,sign(dat[-1]))
#[1] 0.1 1.0 0.0 1.1
#Levels: 0.0 1.0 0.1 1.1
我会亲自切换你的Type 4和Type 3类别,但我认为这取决于你。
答案 1 :(得分:0)
我只能提供一个开始,因为你没有包含逻辑来对类型3和4进行分类,但是将它扩展到其他约束并不困难。
您与ifelse
非常接近,无需使用apply
:
## dat is data.frame from the OP
with(dat, ifelse((is.na(C1) | C1 == 0) & (is.na(C2) | C2 == 0), 1, 2))
## [1] 2 2 1 2
您可以通过替换上面的1
和2
来返回文字字符串,这可以单独使用,也可以作为新列添加到原始data.frame。