【问题标题】:Comparing the corresponding values in two variables比较两个变量的对应值
【发布时间】:2012-03-18 14:27:29
【问题描述】:

我有一个包含两个(嗯,实际上更多,但它们无关紧要)数字变量的数据集。我想将第二个变量中的值与第一个值中的(相应)值进行比较。第二个变量中的值应低于第一个变量中的值。如果不是这种情况,我希望在第三个变量中产生一个值“1”(错误),这表明比较是否成功(错误:是/否)

但是,两列中的值的小数位数可能不同。所以这些应该首先被调整(变量 2 中的每个值应该与变量 1 中的相应值具有相同的小数位数)。为此,我使用了以下功能。

有没有方便的方法在 R 中进行这种比较?

数据示例:

var1  var2
0.06  0.060008314
0.01  0.007975829
0.03  0.034835578
0.03  0.032115433

【问题讨论】:

    标签: r if-statement compare


    【解决方案1】:

    像这样?

    dat = data.frame(x=runif(10), y=runif(10))
    > dat
                x          y
    1  0.54924947 0.26023483
    2  0.89064477 0.28528469
    3  0.87488691 0.18475596
    4  0.27606585 0.49777871
    5  0.19463634 0.59677062
    6  0.52419706 0.62171800
    7  0.44588382 0.55170973
    8  0.07009947 0.71273801
    9  0.25127679 0.24720947
    10 0.04094697 0.08151144
    > dat$error = ifelse(dat$y<dat$x,1,0)
    > dat
                x          y error
    1  0.54924947 0.26023483     1
    2  0.89064477 0.28528469     1
    3  0.87488691 0.18475596     1
    4  0.27606585 0.49777871     0
    5  0.19463634 0.59677062     0
    6  0.52419706 0.62171800     0
    7  0.44588382 0.55170973     0
    8  0.07009947 0.71273801     0
    9  0.25127679 0.24720947     1
    10 0.04094697 0.08151144     0
    

    【讨论】:

    • 我认为 ifelse 会比将 1 或 0 分配给子集要慢。
    【解决方案2】:

    编辑:更新了计算小数点后数字的方法,该方法也适用于以科学记数法表示的数字(借用自 how to return number of decimal places in R

    # sample data
    x <- data.frame(var1 = c(0.06, 0.01, 0.03, 0.03), 
                    var2 = c(0.060008314, 0.007975829, 0.034835578, 0.032115433))
    
    x$var3 <- 0 # first set all var3 to zero
    # figure out how many digits after decimal in var1
    x$dec <- nchar(sub("^.+[.]", "", sub("0+$", "", as.character(x$var1))))    
    # if var1 is <= rounded var2, set equal to 1
    x[x$var1 <= round(x$var2, x$dec), 'var3'] <- 1
    

    四舍五入后,所有 var1 == var2,所以没有 var2 小于 var 1。

    >     x[, 1:3]
      var1        var2 var3
    1 0.06 0.060008314    1
    2 0.01 0.007975829    1
    3 0.03 0.034835578    1
    4 0.03 0.032115433    1
    

    【讨论】:

    • 非常感谢,这一定会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多