У вас нет пропущенных значений, но "na"
символьных строк, поэтому сначала мы конвертируем их:
data[data=="na"] <- NA
data[!complete.cases(data),]
# x1 x2 x3 Date Sales id
# 3 14130 <NA> 2006 26.11.2014 6911 3
# 5 29910 4 <NA> 26.11.2014 5640 5
# 7 <NA> 4 2013 26.11.2014 11430 7
Чтобы сохранить значения "na"
, как они это делают:
data[rowSums(data =="na") >0,]
# x1 x2 x3 Date Sales id
# 3 14130 na 2006 26.11.2014 6911 3
# 5 29910 4 na 26.11.2014 5640 5
# 7 na 4 2013 26.11.2014 11430 7
Наиболее компактный и оптимизированный способ переписать ваш код, который я могу себе представить, заключается в следующем:
let usersCount = 23;
let rounded;
let x = 10 ** (usersCount.toString().length - 1);
rounded = Math.floor(usersCount / x) * x;
Он должен работать рекурсивно без ограничений, как вы и просили.
Вы можете использовать функцию, подобную этой:
const userCount = 234567;
const roundIt = n => {
const numberLength = Math.ceil(Math.log10(n + 1));
const decrease = n > 100 ? 2 : 1;
return Math.floor(n / Math.pow(10, numberLength - decrease)) * Math.pow(10, numberLength - decrease);
};
// Display user count
document.querySelector(".user-count").innerHTML = userCount;
// Display rounded count
document.querySelector(".user-count-rounded").innerHTML = roundIt(userCount);
<h1>
User count: <span class="user-count">0</span>
</h1>
<h1>
Rounded user count: <span class="user-count-rounded">0</span>
</h1>
Мы используем длину числа и раунд используя тот же код, который вы написали.
Вот скрипка: https://jsfiddle.net/anandchowdhary/fj0zk1x8/7/
Следующая функция воспроизводит поведение, приведенное в ваших примерах:
function f(x) {
var m, u;
m = Math.floor(Math.log10(x));
u = Math.pow(10, Math.max(1, m - 1));
return u * Math.floor(x / u);
}
Если вы были бы рады округлить до 2 значащих цифр, вы можете использовать
function f(x) {
return Number.parseFloat(x.toPrecision(2));
}
Вы можете использовать длину строки для вычисления множителя, используя Math.pow :
const usersCount = 23;
const round = s => {
let c = Math.pow(10, s.toString().length - 1);
return Math.floor(s / c) * c;
};
console.log(round(usersCount)); // 20
const round = s => {
let c = Math.pow(10, s.toString().length - 1);
return Math.floor(s / c) * c;
};
[
23,
199,
888,
99999,
100001
].forEach(x => {
console.log(round(x));
});