不明白申请如何在r中获取其参数

时间:2014-03-26 19:54:36

标签: r apply

我正努力让apply()工作:我有两个dataframe

from <- c(1,2,3)
to <- c(2,3,4)
df1 <- data.frame(from, to)

long <-c(9,9.2,9.4,9.6)
lat <- c(45,45.2,45.4,45.6)
id <- c(1,2,3,4)
df2 <- data.frame(long, lat, id)

现在我想要这样的事情:

myFunction <- function(arg){
  >>> How do I access arg$from and arg$to? <<<<
}
apply(df1,1,myFunction)

myFunction中,我需要进行一些计算并为每个from-to对返回一个值。我不明白如何访问arg的部分内容,因为arg[0]只会让我numeric(0)arg$from崩溃。

2 个答案:

答案 0 :(得分:1)

试试mapply()。它是sapply()的多变量版本。例如:

> myFunction <- function(arg1, arg2){
+     return(sum(arg1, arg2))
+ }
> 
> mapply(myFunction, df1$from, df1$to)
[1] 3 5 7

您还可以使用它在数据框中创建一个新变量。

> df1$newvar <- mapply(myFunction, df1$from, df1$to)
> df1
  from to newvar
1    1  2      3
2    2  3      5
3    3  4      7

答案 1 :(得分:1)

问题是apply(...)需要矩阵或数组作为第一个参数。如果传递数据帧,它会将其强制转换为矩阵。矩阵是1索引的,因此左上角的元素是[1,1],而不是[0,0]。此外,无法使用$表示法引用矩阵列。

所以,

f <- function(x) {
  from <- x[1]
  to   <- x[2]
  # do stuff with from and to...
}

apply(df,1,f)

会起作用。

需要注意的另一件事是,如果您的数据框具有包含字符串的(其他)列,则转换将使所有字符(包括数字!)。这是因为,根据定义,矩阵的所有元素必须具有相同的数据类型。但是,您的示例没有这个问题。