【发布时间】:2015-10-05 10:40:07
【问题描述】:
假设我有以下数据
x <- rnorm(100)
我想创建另一个列,其中如果x 等于或大于 0.2,则为其赋值 1,否则为 0。
【问题讨论】:
标签: r if-statement
假设我有以下数据
x <- rnorm(100)
我想创建另一个列,其中如果x 等于或大于 0.2,则为其赋值 1,否则为 0。
【问题讨论】:
标签: r if-statement
我们可以创建逻辑条件并用+包装
xNew <- +(x >=0.2)
如果我们需要data.frame,
dat <- data.frame(x, xNew)
或使用ifelse
xNew <- ifelse(x >= 0.2, 1, 0)
【讨论】:
+ 将逻辑 TRUE/FALSE 强制转换为二进制 1/0
as.numeric
as.integer 更快(并且使意图更加明显)。
您想使用 Heaviside 函数。例如,您可以在 fbasics 包中找到它。
set.seed(42)
x <- rnorm(100)
library(fBasics)
Heaviside(x, 0.2)
【讨论】:
这样做是为了上校的利益:
library(microbenchmark)
set.seed(1492)
x <- rnorm(10000)
microbenchmark(asi=as.integer(x >= 0.2),
asn=as.numeric(x >= 0.2),
pls=+(x >=0.2),
hsd=Heaviside(x, 0.2))
## Unit: microseconds
## expr min lq mean median uq max neval cld
## asi 18.351 20.7575 27.88867 22.4250 22.8695 598.206 100 a
## asn 23.710 25.9740 32.77422 29.2405 29.9860 340.234 100 a
## pls 17.989 20.2640 26.07038 22.6855 23.3020 320.443 100 a
## hsd 88.493 92.2145 148.17850 94.1935 95.5250 2831.695 100 b
Heaviside 完全不是如果您完全关心性能,您想要做的事情。而且,它只是在做:
function (x, a = 0) {
result = (sign(x - a) + 1)/2
result
}
无论如何。
【讨论】:
+ 和 as.numeric 是不公平的比较。前者返回integer。
Heaviside 函数中时会发生什么?毕竟,没有人愿意用难以理解的黑客来乱扔他们的代码库,而函数正是为了解决这个问题。 (编辑:试过了。它几乎与最快的解决方案相当。这令人放心。)
+() 怎么听不懂? “一元 + 和一元 - 返回一个数字或复数向量。如果没有强制转换,所有属性(包括类)都将保留:逻辑 x 被强制转换为整数,名称、dim 和 dimnames 被保留。” (来自help(+))