R — Избегание циклов for с автоматической итерацией

#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() это правильный способ узнать, сколько у вас обращений.