передать функцию с несколькими аргументами и некоторыми константами в столбец данных и вывести новый столбец для каждого члена в векторе - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать столбец в моем df, df называется combo, в качестве аргумента 'h' в моей функции. А также вектор 'v'. Значение df:

  • 'data.frame': 10 шт. из 2 переменных:
    • $ фальшивый: num 2.24e-05 2.40e-05 2.69e-05 2.87e-05 3.14e-05 ...
    • $ funny: int 1 2 3 4 5 6 7 8 9 10

Вектор ve: -str (ve) - num [1: 6] 1,37 2,4 2,23 3,2 2,9 3,22

Функция:

f<-function(h, v){
  m_k<- (Density*h)/(Cd*v)
  y<- m_k*(v*sin(a)+(m_k*g))
  return (y)
}

, где Density и Cd - константы. Я получаю следующую ошибку при запуске f(combo$fake, ve)

Предупреждающие сообщения:

1: In (Density * h) / (Cd * v):

большая длина объекта не кратна короткой длине объекта

, и я получаю, что они не имеют одинаковую длину. Но я хотел бы, чтобы R применил функцию, используя первый член ve для каждого члена в combo$fake, создав один столбец для этого первого ve, а затем повторил со вторым членом в ve, чтобы в конце у меня есть 6 столбцов и 10 строк результатов, заданных функцией.

Я пытался использовать функции apply и a для l oop, а также явно ссылаться на аргументы, как при combo$fake, но я хочу избежать жесткого кодирования функции (иначе я бы не использовал функция). Это всего лишь образец, мой реальный набор данных намного больше.

Вот несколько примеров того, что я пробовал, и фрагмент данных.

combo$fake $funny
        <dbl>  <int>
 1  0.0000224      1
 2  0.000024       2
 3  0.0000269      3
 4  0.0000287      4
 5  0.0000314      5
 6  0.0000324      6

y<-    for (i in seq_len(ve))  {
  for(j in seq_along(combo$fake))

    f(combo$fake, ve)
}
y<- mapply(f, ve, combo$fake)

Я пытался прочитать другие подобные вопросы по stackoverflow, но я просто не могу заставить его работать :-(. Излишне говорить, что я очень новичок в R, пожалуйста помогите и заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2020

mapply берет первый элемент каждого аргумента и помещает его в вашу функцию, затем переходит ко второму элементу каждого аргумента и так далее. Вы можете просто привести ваши аргументы в нужную форму, повторяя его элементы, так что элемент один из ve объединяется с каждым элементом df$fake перед использованием следующего значения ve. Поэтому, по сути, используя rep с его аргументами times и each.

Если я правильно понимаю ваш вопрос, вы можете использовать что-то вроде этого:

# your function and its constants
f<-function(h, v){
  Density <- 10
  Cd <- 10
  a <- 10
  g <- 10
  m_k<- (Density*h)/(Cd*v)
  y<- m_k*(v*sin(a)+(m_k*g))
  return (y)
}

# some dataframe and vector
df <- data.frame(fake = 1:10)
ve <- 20:25

# call mapply by repeating df$fake by the length of vector
# and repeat each element in the vector by the number of elements in df$fake
results <- mapply(f, rep(df$fake, times = length(ve)),
                     rep(ve, each = length(df$fake)))

# reshape the output
matrix(results, nrow=length(df$fake), ncol=length(ve))
...