Приходя из других языков, я нахожу R мощным и интуитивно понятным, но я не в восторге от его производительности. Поэтому я решил попытаться улучшить некоторые написанные мною фрагменты и научиться лучше кодировать на R.
Вот функция, которую я написал, пытаясь определить, является ли вектор двоичным (два разных значения или только одно значение) или нет:
isBinaryVector <- function(v) {
if (length(v) == 0) {
return (c(0, 1))
}
a <- v[1]
b <- a
lapply(v, function(x) { if (x != a && x != b) {if (a != b) { return (c()) } else { b = x }}})
if (a < b) {
return (c(a, b))
} else {
return (c(b, a))
}
}
РЕДАКТИРОВАТЬ: Ожидается, что эта функция будет просматривать вектор, а затем возвращать c()
, если он не имеет двоичного значения, и возвращать c(a, b)
, если это так, a - маленькое значение, а b - большее (если a == b, то просто c(a, a)
. например, для
A B C
1 1 1 0
2 2 2 0
3 3 1 0
Я lapply
сделаю это isBinaryVector
и получу:
$A
[1] 1 1
$B
[1] 1 1
$C
[1] 0 0
Время, затраченное на набор данных среднего размера (около 1800 * 3500, 2/3 из них двоичные), составляет около 15 секунд. Набор содержит только числа с плавающей запятой.
Могу ли я сделать это быстрее?
Спасибо за любой вклад!
lapply
вызов ничему не назначен. Если v является фреймом данных, a и b изначально являются просто первым столбцом v. Затем вы проверяете, идентичен ли каждый столбец a и b (которые сами идентичны) неправильно, используя векторизованные сравнения в операторе if. Я мог бы продолжить. Считайте меня сбитым с толку. - person joran   schedule 19.04.2012