2012-03-18 143 views
2

我有一個包含兩個數據集的數據集(當然,實際上還有更多,但它們是不相關的)。我想比較第二個變量的值與第一個值中的(對應)值。第二個變量中的值應該低於第一個變量中的值。如果不是這種情況,我希望這會導致第三個變量的值爲1(錯誤),表示比較是否成功(錯誤:是/否)比較兩個變量的相應值

但是,兩列的小數位數可能不同。因此應首先調整這些值(變量2中的每個值都應具有與變量1中相應值相同的小數位數)。爲此,我使用了下面的功能。

有沒有一種方便的方法在R中進行比較?數據的

實施例:

var1 var2 
0.06 0.060008314 
0.01 0.007975829 
0.03 0.034835578 
0.03 0.032115433 

回答

2

喜歡這個?

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 
+0

我認爲ifelse會比分配1或0給子集要慢。 – GSee 2012-03-18 15:23:01

1

編輯:計數數字更新方法小數也適用於在科學記數法表示的數字後(從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 
+0

非常感謝,這肯定會有幫助! – mats 2012-03-19 09:37:38