Почему, когда я передаю массив данных целых чисел, чтобы применить функцию в R, переменная преобразуется? - PullRequest
1 голос
/ 18 марта 2020

Я довольно новичок ie в R, поэтому, пожалуйста, будьте снисходительны. Это должно быть что-то действительно простое. У меня есть функция, которую я хотел бы выполнить для каждого элемента данных. Минимальный пример:

agenericfunction = function(pos) {
   print(pos)
}

Когда я вызываю функцию следующим образом:

apply(as.data.frame(1:5), 1, agenericfunction)

Вот что я получаю:

1:5 
  1 
1:5 
  2 
1:5 
  3 
1:5 
  4 
1:5 
  5 
[1] 1 2 3 4 5

Но если я изменю функцию как это:

agenericfunction = function(pos) {
  print(paste0("_",pos))
}

Затем я получаю то, что обычно ожидаем:

[1] "_1"
[1] "_2"
[1] "_3"
[1] "_4"
[1] "_5"
[1] "_1" "_2" "_3" "_4" "_5"

Я не понимаю, почему моя целочисленная переменная 'pos' преобразуется в первом случае в какой-то странный вещь, которая провоцирует этот вывод. Если я использую функцию «класс» для «pos», он всегда говорит, что это целое число (в любом из двух случаев выше). Может ли кто-нибудь объяснить это поведение?

Заранее спасибо и наилучшими пожеланиями

1 Ответ

0 голосов
/ 18 марта 2020

В первом случае вы видите имя столбца над каждым целым числом. Это означает, что когда вызывается as.data.frame, он создает столбец с colnames 1:8.

Если вы выполните df <- as.data.frame(1:8), а затем colnames(df), вы увидите это:

> names(t)
[1] "1:8"

Относительно того, почему он работает с paste0, paste0 игнорирует имя столбца и просто возвращает значения, которые находятся внутри. Изменение вашей функции для возврата return(paste0(pos)) даст желаемый результат.

Если вы хотите избежать этого, лучше всего создать матрицу вместо data.frame:

apply(matrix(1:5), 1, agenericfunction)

Вывод:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1 2 3 4 5
...