Вы также можете использовать addNA()
.
x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1 1 2 2 3 <NA>
# Levels: 1 2 3 <NA>
Это в основном удобная функция для факторинга с exclude = NULL
. Из help(factor)
-
blockquote>
addNA
изменяет коэффициент, поворачиваяNA
на дополнительный уровень (так что значенияNA
подсчитываются, например, в таблицах).Итак, еще одна причина, по которой это хорошо, потому что, если у вас уже есть коэффициент
f
, вы можете использоватьaddNA()
, чтобы быстро добавитьNA
как факторный уровень без измененияf
. Как указано в документации, это удобно для таблиц. Он также хорошо читается.
#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/
кроме того, статья CodeProject для общих строковых методов: http://www.codeproject.com/KB/stl/STL_string_util.aspx
> std::string data = “Abc”;
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);
Это будет работать, но это будет использовать стандарт "C" локаль. Можно использовать фасеты, если необходимо получить tolower для другой локали. Вышеупомянутый код с помощью фасетов был бы:
locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
Необходимо также рассмотреть этот вопрос . В основном проблема состоит в том, что стандартные библиотеки C/C++ не были созданы для обработки данных Unicode, таким образом, необходимо будет обратиться к другим библиотекам.
Это может измениться, поскольку стандарт C++ обновляется. Я знаю, что следующий компилятор от Borland (CodeGear) будет иметь поддержку Unicode, и я предположил бы, что компилятор C++ Microsoft будет иметь, или уже имеет строковые библиотеки тот Unicode поддержки.
Как Darren сказал Вам, самый легкий метод должен использовать станд.:: преобразовать.
, Но остерегаются этого на некотором языке, как немецкий язык, например, существует не всегда один к одному отображению между ниже и верхний регистр. "esset" символ нижнего регистра (похожи на греческую символьную бету) преобразовывается к "SS" в верхнем регистре.
То, что говорит Steve, правильно, но я предполагаю, что, если Ваш код должен был поддерживать несколько языков, у Вас мог бы быть метод фабрики, который инкапсулирует ряд методов, которые делают соответствующий toUpper или toLower на основе того языка.
Для копипастеров, надеющихся использовать ответ Ника Стронга, обратите внимание на орфографическую ошибку в "use_factet" и отсутствие третьего параметра в std :: transform:
locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
должно быть
locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));