我有一个包含两个数据集的数据集(嗯,实际上更多,但它们是无关紧要的)数字变量。我想将第二个变量中的值与第一个值中的(对应)值进行比较。第二个变量中的值应低于第一个变量中的值。如果不是这种情况,我希望在第三个变量中产生值'1'(错误),这表明比较是否成功(错误:是/否)
但是,两列中的值可能会有不同的小数位数。因此,应首先调整这些值(变量2中的每个值应与变量1中的相应值具有相同的小数位数)。为此,我使用了以下功能。
数据示例:
var1 var2
0.06 0.060008314
0.01 0.007975829
0.03 0.034835578
0.03 0.032115433
答案 0 :(得分:3)
喜欢这个吗?
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
答案 1 :(得分: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小于var1。
> 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