【问题标题】:If () statement in RR中的if()语句
【发布时间】:2015-03-05 02:17:53
【问题描述】:

我是 R 的新手,对 R 中的 if () 语句有疑问。非常感谢任何帮助。 我的数据如下所示

Var1    var2 
01         A
02         D
03         E
04         K

我需要基于 var1 创建 2 个附加变量(Var3 和 Var4)。在 SAS 中,我将通过以下方式创建 var3 和 var4:

if var1 = 01 then do; var3 = "New York";   var4= "NYC"; end; else;
if var1 = 02 then do; var3 = "Illinois";   var4= "ORD"; end; else;
if var1 = 03 then do; var3 = "Texas";      var4= "DFW"; end; else;
if var1 = 04 then do; var3 = "New Jersey"; var4= "EWR"; end; else;

我想将上面的 if 语句转换成 R 程序。任何帮助是极大的赞赏。

【问题讨论】:

    标签: r


    【解决方案1】:
    var3 <- c("New York", "Illinois", "Texas", "New Jersey")[
                     match(var1, c("01","02","03","04")]
    var4 <- c("NYC", "ORD", "DFW", "EWR")[
                     match(var1, c("01","02","03","04")]
    

    通常,您将使用的项目是数据框,而不是您在 SAS 世界中拥有的集合。所以你会有一个数据对象名称,比如dat,你可以执行:

    dat$var4 <- with( dat, c("NYC", "ORD", "DFW", "EWR")[
                     match(var1, c("01","02","03","04")] )
    

    【讨论】:

    • 同意。 BondedDust 在编码R 方面非常邪恶。
    • 我不需要积分。你们可以当晚掌舵。
    • 谢谢。如果 var1 有重复且超过 100 个元素,程序将如何变化?
    • 我认为它根本不会改变。为什么不举一个例子来说明您预见或遇到的任何问题?在代码、可维护性和计算时间方面,它被认为是最有效的解决方案。它不是专门设计为 ifelse-strategy 的,因为当问题较大时,它们不能很好地扩展。
    • 感谢 BondedDust。很难在评论中格式化文本,因此我将添加新问题。
    【解决方案2】:

    我强加给自己的基本 R 规则是将您可能需要调用的数据存储在适当的结构中(例如 - vectors 用于一系列值,lists 用于相关的不等值系列长度,data.frames 用于相关的等长系列等)。

    因此,在这种情况下,适当的结构是相同长度的相关系列的 data.frame。例如:

    srcs <- data.frame(
      Var1=c("01","02","03","04"),
      state=c("New York", "Illinois", "Texas", "New Jersey"),
      code=c("NYC", "ORD", "DFW", "EWR")
    )
    

    然后使用该存储的基本信息酌情添加新变量,例如:

    dat <- cbind(dat, srcs[c("state","code")][match(dat$Var1,srcs$Var1),] )
    
    #  Var1 var2      state code
    #1   01    A   New York  NYC
    #2   02    D   Illinois  ORD
    #3   03    E      Texas  DFW
    #4   04    K New Jersey  EWR
    

    这会将一大堆if/else 语句转换为一个调用,并避免需要丑陋的循环操作。

    【讨论】:

      【解决方案3】:

      另一种解决方案是使用ifelse(假设var1 只有四个值)。

      mydata$var3<- with (mydata, ifelse(var1 =="01", "New York" ,
                    ifelse (var1 == "02", "Illinois",
                    ifelse (var1 == "03","Texas" ,"New Jersey" ))))
      
      mydata$var4<-with (mydata, ifelse (var1 =="01", "NYC",
              ifelse (var1 == "02","ORD",
            ifelse (var1 == "03", "DFW","EWR"))))
      

      【讨论】:

      • 感谢指标。如果 var1 有重复且超过 100 个元素,那么最好的方法是什么?
      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2016-03-05
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多