R:使用

时间:2015-05-26 01:30:54

标签: r

我有以下数据框:

   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中的陈述?

如果有人知道另一种方法,那就太棒了!非常感谢提前!!

2 个答案:

答案 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

您可以通过替换上面的12来返回文字字符串,这可以单独使用,也可以作为新列添加到原始data.frame。