Как применить функцию, возвращающую data.frames с коэффициентами для последовательности

Как применить функцию, которая возвращает data.frame с коэффициентами в последовательность?

Пример:

s <- factor(c(10, 20, 30))
t <- factor(c("a", "b", "a"))
v <- c(5, 6, 4)

df <- data.frame(s,t,v)

Таким образом, data.frame df:

   s t v
1 10 a 5
2 20 b 6
3 30 a 4

У меня также есть функция, которая возвращает data.frame:

simpleFunc2 <- function(df, x){
  tmp <- subset(df, df$s == x)
  return(tmp)
}

Теперь у меня есть последовательность

x <- c(20, 30, 10, 30, 10)

и хотите получить результат при применении функции simpleFunc2 к этой последовательности.

Я использую sapply

sapply(x, function(x) simpleFunc2(df, x))

Но я получаю

  [,1]     [,2]     [,3]     [,4]     [,5]    
s factor,1 factor,1 factor,1 factor,1 factor,1
t factor,1 factor,1 factor,1 factor,1 factor,1
v 6        4        5        4        5  

Как мне вернуть правильные значения факторов?

Этот пример упрощен. Поэтому, возможно, в этом случае есть гораздо более простой способ сделать это.

Ответ 1

Попробуйте lapply вместо этого с do.call как в:

do.call(rbind, lapply(x, function(x) simpleFunc2(df=df, x)))

Ответ 2

Я вижу, что вы получили ответ на свой вопрос, но я думаю, что ваш подход к выбору надмножества из этого фреймворка был слишком вовлечен. (И мои извинения, если эта функция не была репрезентативной. Я хотел бы предложить метод извлечения, который быстрее, чем переход через subset:

> df[ match(x, df$s), ]
     s t v
2   20 b 6
3   30 a 4
1   10 a 5
3.1 30 a 4
1.1 10 a 5
# Save results as from:
> do.call(rbind, lapply(x, function(x) simpleFunc2(df, x)) )
    s t v
2  20 b 6
3  30 a 4
31 10 a 5
32 30 a 4
5  10 a 5

Ответ 3

Я не совсем понимаю вопрос, но оба ответа указывают на то, что хотя бы один простой метод отсутствовал все это время. Часто бывает удобно печатать

merge(df,as.data.frame(x),by=1)

для получения отсортированного вывода с именами правой строки/столбца

   s t v
1 10 a 5
2 10 a 5
3 20 b 6
4 30 a 4
5 30 a 4

Что касается производительности, предлагаемый метод не может конкурировать с методом, использующим "совпадение", но легко превосходит метод в принятом ответе.

   microbenchmark::microbenchmark(
 do.call=do.call(rbind, lapply(x, function(x) simpleFunc2(df, x))),
 match=df[match(x, df$s), ],
 merge= merge(df,as.data.frame(x),by=1))

,

Unit: microseconds
    expr      min       lq    median        uq      max neval
 do.call 2487.451 2523.033 2547.4060 2604.3850 9554.748   100
   match  175.117  180.197  183.2465  187.8135  248.835   100
   merge 1020.307 1035.062 1049.4835 1071.6575 8057.059   100