2017-11-04 2 views
2

データフレームの複数の列を引数として使用する関数を適用しようとしています。ここではforループを使うことができますが、これを行う方法が他にあるかどうかを確認したい場合引数として複数の列を使用する関数を適用すると、関数はdata.frameを返します。

ここでは簡単な例を示します。私の元の問題はやや複雑です。

DF1<-data.frame(start=seq(from=1, to=5, by=1),end=seq(from=10, to=14, by=1)) 

rep_fun <- function(x,y) 
{ 
    data.frame(A=seq(x, y)) #produces a sequence between x and y 
} 

DF2<-data.frame() 
for (i in 1:nrow(DF1)){ 
    temp<-data.frame(rep_fun(DF1$start[i],DF1$end[i])) 
DF2<-rbind(temp,DF2) # this contains a dataframe that has a sequence between 'start' and 'end' for each row in DF1 

} 

forループで得られる望ましい結果を以下に示します。すべての行がここに表示されているわけではありません。一緒に行1〜10、配列がDF1 5

> DF2 
    A 
1 5 
2 6 
3 7 
4 8 
5 9 
6 10 
7 11 
8 12 
9 13 
10 14 
11 4 
12 5 
+0

これはxyの問題の一例です。しかし、これは可能なアプローチです: 'as.vector(DF1、1、function(x)x [1]:x [2]))' – missuse

+0

私が言及したように、私の元の問題はもっと複雑です。元の問題のrep_funは、複数の行と複数の列のデータフレームを返します。 – ashleych

答えて

3

1行に対応示す)lapply分割DF1nrow(DF1):1によって、それが逆の順序で出てくるようにし、そのリスト上lapplyrbindそのコンポーネント。パッケージは使用されません。

DF3 <- do.call("rbind", lapply(split(DF1, nrow(DF1):1), with, rep_fun(start, end))) 
rownames(DF3) <- NULL 

identical(DF2, DF3) 
## [1] TRUE 

2)地図またはこの代替:

fun <- function(x) with(x, rep_fun(start, end)) 
DF4 <- do.call("rbind", Map(fun, split(DF1, nrow(DF1):1), USE.NAMES = FALSE)) 

identical(DF4, DF2) 
## [1] TRUE 

3)地図/同様に(2)これはMapを使用するが、この時間は直接rep_funを使用しての牧師また、splitではなく、計算後に出力を順序付けして計算前に入力を並べ替えるには、revを使用します。

DF5 <- do.call("rbind", with(DF1, rev(Map(rep_fun, start, end)))) 

identical(DF5, DF2) 
## [1] TRUE 
+0

正直言って、逆のことは必須条件ではありませんでしたが、それが可能であることを知ることができました!オプション3は私がやっているものです。オリジナルの問題のForループオプションより約3倍高速です! – ashleych

関連する問題