#r
#r
Вопрос:
Это надуманный пример, который я использую, чтобы, надеюсь, лучше понять R. Допустим, я хочу подмножество символьного вектора под названием «test». Я хочу возвращать значение каждого элемента от третьего символа до последнего символа. Это не работает:
test = c( "Jane" , "Jerry" , "Joan" )
substr( test , 3 , length( test ) )
expecting: "ne" , "rry" , "an"
Есть ли способ сделать это без цикла for?
Ответ №1:
Используйте nchar()
. Это векторизовано:
> test = c( "Jane" , "Jerry" , "Joan" )
> substr( test , 3 , nchar( test ) )
[1] "ne" "rry" "an"
Учитывая, что nchar вернет вектор длин, и что substr аналогично векторизован, и поэтому ожидается работа с векторными аргументами, одна потенциальная загадка заключается в том, почему он вообще принимает скалярный аргумент 3
. Ответ здесь заключается в том, что скаляры для аргументов start и stop перерабатываются, чтобы соответствовать длине входного символьного вектора. Следовательно, вы могли бы даже использовать 1: 2 для начального аргумента и получать чередующиеся полные и почти полные строки:
> substr( test , 1:2 , nchar( test ) )
[1] "Jane" "erry" "Joan"
Комментарии:
1. @DWin — не могли бы вы объяснить немного больше?
2. length(test) возвращает номер элемента в test, т.е. 3. Вместо этого вы можете использовать nchar для подсчета количества символов.
3. О! Я думаю, что понимаю. nchar выполняет итерации по каждому элементу в test, тогда как length работает с самим вектором? и первый называется «векторизованным»?
4. Мне это нравится — момент «ага» 🙂
5. Другая путаница, с которой вы можете столкнуться
length()
, заключается в том, что вы используете его во фрейме данных. Вы могли бы ожидать, что это приведет к количеству строк, но на самом деле это даст количество столбцов. Попробуйте.NROW()
это правильный способ узнать, сколько у вас обращений.