Я лично испытываю отвращение к ifelse
и склонен вместо этого использовать две строки кода вместо того, чтобы заполнить значение по умолчанию, а затем альтернативу, примененную условно.
Для циклического прохождения всех ваших столбцов вы можете использовать следующий код (я не тестировал его, так как нет данных)
for(i in 1:10){
HRSdata2[,paste0('h',i,'logass')] <- 0
w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)
HRSdata2[w,paste0('h',i,'logass')] <- HRSdata2[w,paste0('h',i,'atotb')]
}
Этот код выведет ноль для значений NA, если это не так Вы должны заменить:
w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)
на:
w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0 | is.na( HRSdata2[,paste0('h',i,'atotb')] ) )
Они - по существу лошади для курсов.
Scanner
разработан для случаев, где необходимо проанализировать строку, вытащив данные различных типов. Это очень гибко, но возможно не дает Вам самый простой API для того, чтобы просто получить массив строк, разграниченный конкретным выражением.String.split()
и Pattern.split()
дайте Вам легкий синтаксис для того, чтобы сделать последнего, но это - по существу все, что они делают. Если Вы захотите проанализировать получившие строки или изменить разделитель на полпути через в зависимости от конкретного маркера, то они не помогут Вам с этим.StringTokenizer
еще более строго, чем String.split()
, и также немного более трудный для использования. Это по существу разработано для того, чтобы вытащить маркеры, разграниченные фиксированными подстроками. Из-за этого ограничения это о дважды с такой скоростью, как String.split()
. (См. мое сравнение String.split()
и StringTokenizer
.) Это также предшествует регулярным выражениям API, который String.split()
часть.Вы отметите в моих синхронизациях это String.split()
может все еще маркировать тысячи строк в нескольких миллисекундах на типичной машине. Кроме того, это имеет преимущество StringTokenizer
то, что это дает Вам вывод как массив строк, который обычно является, что Вы хотите. Используя Enumeration
, в соответствии с StringTokenizer
, является также "синтаксически суетливым" большую часть времени. С этой точки зрения, StringTokenizer
определенная трата пространства в наше время, и можно также просто использовать String.split()
.
Давайте запустимся путем устранения StringTokenizer
. Это становится старым и даже не поддерживает регулярные выражения. Его состояния документации:
StringTokenizer
класс прежней версии, который сохраняется по причинам совместимости, хотя ее использованию препятствуют в новом коде. Рекомендуется, чтобы любой ищущий эту функциональность использовалsplit
методString
илиjava.util.regex
пакет вместо этого.
Поэтому давайте выведем его сразу же. Это уезжает split()
и Scanner
. Каково различие между ними?
С одной стороны, split()
просто возвращает массив, который помогает использовать цикл foreach:
for (String token : input.split("\\s+") { ... }
Scanner
создается больше как поток:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
или
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Это имеет довольно большой API, не думайте, что это всегда ограничивается такими простыми вещами.)
Этот интерфейс потокового стиля может быть полезен для парсинга простых текстовых файлов или консольного входа, когда Вы не имеете (или не может добраться), весь вход прежде, чем начать анализировать.
Лично, единственное время я могу не забыть использовать Scanner
для школьных проектов, когда я должен был получить ввод данных пользователем от командной строки. Это делает такую операцию легкой. Но если у меня есть a String
то, что я хочу развестись, это - почти легкая задача для движения с split()
.
Если у Вас есть Строковый объект, Вы хотите маркировать, способствовать методу разделения Строки использования по StringTokenizer. Если Вы анализируете текстовые данные из источника вне Вашей программы, как из файла, или от пользователя, это - то, где Сканер пригождается.
StringTokenizer всегда был там. Это является самым быстрым из всех, но подобная перечислению идиома не могла бы выглядеть столь же изящной как другие.
разделение пришло к существованию на JDK 1.4. Медленнее, чем токенизатор, но легче использовать, так как это является вызываемым от Строкового класса.
Сканер оказался на JDK 1.5. Это является самым гибким и заполняет давнишний разрыв на Java API для поддержки эквивалента известного семейства функций Cs scanf.
String.split кажется намного медленнее, чем StringTokenizer. Единственное преимущество разделения состоит в том, что вы получаете массив токенов. Также вы можете использовать любые регулярные выражения в split. org.apache.commons.lang.StringUtils имеет метод разделения, который работает намного быстрее, чем любой из двух, а именно. StringTokenizer или String.split. Но загрузка ЦП у всех трех почти одинакова. Таким образом, нам также нужен метод, менее требовательный к процессору, который я до сих пор не могу найти.