我正努力让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
崩溃。
答案 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)
会起作用。
需要注意的另一件事是,如果您的数据框具有包含字符串的(其他)列,则转换将使所有字符(包括数字!)。这是因为,根据定义,矩阵的所有元素必须具有相同的数据类型。但是,您的示例没有这个问题。