簡體   English   中英

應用使用多列作為參數的函數,函數返回一個data.frame

[英]Applying function using multiple columns as argument , function returns a data.frame

我試圖應用一個函數,該函數使用一個數據框的多個列作為參數,並且該函數為每一行返回一個數據框。 我可以在這里使用for循環,但是想要檢查是否有其他方法可以執行此操作

這里提供一個簡單的例子。 我原來的問題稍微復雜一些。

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

1)lapply拆分DF1nrow(DF1):1 ,使得其以相反的順序出來,然后lapply在該列表和rbind及其組件在一起。 不使用任何軟件包。

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)Map / rev像(2)一樣使用Map但是這次直接使用rep_fun 同樣,它使用rev在計算之后對輸出進行排序,而不是在計算之前對split進行排序。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM