Ответ 1
Попробуйте lapply
вместо этого с do.call
как в:
do.call(rbind, lapply(x, function(x) simpleFunc2(df=df, x)))
Как применить функцию, которая возвращает 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
Как мне вернуть правильные значения факторов?
Этот пример упрощен. Поэтому, возможно, в этом случае есть гораздо более простой способ сделать это.
Попробуйте lapply
вместо этого с do.call
как в:
do.call(rbind, lapply(x, function(x) simpleFunc2(df=df, x)))
Я вижу, что вы получили ответ на свой вопрос, но я думаю, что ваш подход к выбору надмножества из этого фреймворка был слишком вовлечен. (И мои извинения, если эта функция не была репрезентативной. Я хотел бы предложить метод извлечения, который быстрее, чем переход через 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
Я не совсем понимаю вопрос, но оба ответа указывают на то, что хотя бы один простой метод отсутствовал все это время. Часто бывает удобно печатать
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