使用多列作为参数应用函数,函数返回data.frame

时间:2017-11-04 12:37:20

标签: r function apply

我正在尝试应用一个使用数据帧的多个列作为参数的函数,该函数返回每行的数据帧。我可以在这里使用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 个答案:

答案 0 :(得分:3)

1)lapply DF1拆分nrow(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)地图/版本与(2)一样,它使用Map,但这次直接使用rep_fun。此外,它使用rev在计算之后对输出进行排序,而不是split在计算之前对输入进行排序。

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

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