R применить разрывы для нечисловых параметров - PullRequest
0 голосов
/ 03 октября 2018

Мне не хватает хорошего понимания функции apply, которая, возможно, приводит к появлению сообщения об ошибке при циклическом цикле по фрейму данных , где один столбец является символом .

Я использую apply путем передачи строк кадра данных в мою пользовательскую функцию (UDF).

Все работает хорошо, когда все столбцы кадра данных numeric.

Когда я изменяю один изот столбцов к символу, тогда моя UDF все еще работает, если я пропускаю строки данных по одному.

Однако , как только я использую apply, тогда я получаю эту ошибку:

нечисловой аргумент бинарного оператора

Вот пример кода, который иллюстрирует проблему:

Определение UDF:

UDF <- function(x){return(x[1] + x[2])}

Определите фрейм данных:

x <- data.frame(col1 = c(1,2), col2 = c(3,4), col3 = c(5,6))

x
  col1 col2 col3
    1    3    5
    2    4    6

Теперь, если я использую apply, он работает:

apply(x,1,FUN = UDF)
[1] 4 6

Если я изменяю col3 (обратите внимание, что col3 не используется в UDF)чтобы быть character через x$col3 <- as.character(x$col3), и я передаю одну строку в UDF, он все еще работает:

UDF(x[1,])
  col1
1    4

Но если я использую apply на этомс кадром данных, то он ломается и выдает ошибку, говоря, что он не может плюс x[1] и x[2]:

apply(x,1,FUN = UDF)

Ошибка в x [1] + x [2]: нечисловой аргумент бинарного оператора

Что мне не хватает?

Спасибо

1 Ответ

0 голосов
/ 03 октября 2018

Функция apply работает с матрицами (и массивами).Если вы используете apply с рамкой Дара, она преобразуется в матрицу наиболее общего типа.Тип символа является более общим, чем числовой тип.Таким образом, все значения станут символьными строками (для которых функция UDF не работает), если во фрейме данных присутствует хотя бы один символьный столбец.

Чтобы избежать такого поведения,Вы можете использовать by вместо:

by(x, seq(nrow(x)), UDF)
# [1] 4
# --------------------------------------------------------------------------------- 
# [1] 6

Другой вариант - rowwise в упаковке dplyr:

library(dplyr)
x %>% rowwise %>% UDF
#   col1
# 1    4
# 2    6
...