Ваша функция foobar
ожидает три аргумента, и вы предоставили ей только два аргумента с foobar(foo, df)
.Вы можете использовать apply
, чтобы получить то, что вы хотите:
apply(df, 1, function(x) foobar(foo, x[1], x[2]))
И используется:
> apply(df, 1, function(x) foobar(foo, x[1], x[2]))
[1] 2 1 1
Чтобы ответить на ваши изменения:
Я не совсем уверен, что означает y[, c(var1)]
, но вот попытка выяснить, что вы пытаетесь сделать.
Что я думаю, что вы пытались сделатьбыло: foobar(foo, y = df[, "var1"], z = df[, "var2"])
.
Во-первых, обратите внимание, что здесь не нужно использовать c()
, и вы можете ссылаться на нужные столбцы, помещая имя столбца в кавычки ИЛИ ссылаться на столбец по номеру (как я делал выше).Во-вторых, df[, "var1"]
возвращает все строки для имен столбцов var1
, длина которых равна трем:
> length(df[, "var1"])
[1] 3
Функция, которую вы определили, не настроена для работы с векторами длиной больше 1Вот почему нам нужно перебирать каждую строку вашего фрейма данных, чтобы получить одно значение, обработать его, а затем перейти к следующей строке в фрейме data.frame.Это то, что делает функция apply.Это эквивалентно тому, чтобы говорить что-то вроде for (i in 1: length(nrow(df))
, но это более идиотский способ решения таких проблем.
Наконец, есть ли причина, по которой вы сгенерировали var1
как фактор?На мой взгляд, имеет больше смысла рассматривать их как числовые.Сравните:
> str(df)
'data.frame': 3 obs. of 2 variables:
$ var1: Factor w/ 2 levels "1","3": 1 1 2
$ var2: Factor w/ 3 levels "A","B","C": 1 2 3
Против
> df2 <- data.frame(var1=c(1,1,3), var2=c("A", "B", "C"))
> str(df2)
'data.frame': 3 obs. of 2 variables:
$ var1: num 1 1 3
$ var2: Factor w/ 3 levels "A","B","C": 1 2 3
В итоге - apply
- это функция, которую вы ищете здесь.Возможно, вы захотите потратить некоторое время на размышления о том, должны ли ваши данные быть числовыми или иметь коэффициент, но применять все равно нужно.