【问题标题】:R: Multiple if statement function with applyR:带有应用的多个if语句函数
【发布时间】:2015-05-26 10:56:55
【问题描述】:

我有以下数据框:

   ID     C1       C2
    1      0       100
    2      29       0
    3      0        0
    4     789      400

我想根据“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 语句,如 excel 中的“if”语句?

如果有人知道这样做的替代方法,那就太好了!提前非常感谢!!

【问题讨论】:

  • 您提到类型 1 和 2 的逻辑,但您想要的输出显示 1 到 4。请提供更详细的信息。

标签: r


【解决方案1】:

使用sign 将数据转换为1/0 后,您可以使用interaction 到达那里:

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

我会亲自切换您的第 4 类和第 3 类类别,但我想这取决于您。

【讨论】:

    【解决方案2】:

    我只能提供一个开始,因为您没有包含对类型 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多