[英]R: mapply with vector argument
我有這種形式的功能:
foo<-function(x,y){
if(length(y)==1){
return(x*y)
}
else{
return(x-y[1]*y[2])
}
}
對於y參數,我傳遞一個數字或一個數字向量:
> #test function:
> foo(1,2)
[1] 2
> foo(1,c(1,2))
[1] -1
現在,我希望對這個函數使用mapply,但是當我想為y參數傳遞向量時遇到了問題:
df<-data.frame(
"a"<-floor(runif(6, 1,10)),
"b"<-floor(runif(6, 18,80)),
"c"<-floor(runif(6, 1,80)),
"d"<-floor(runif(6, 100,800)),
"e"<-floor(runif(6, 1000,4000)),
"f"<-floor(runif(6, 1,10)),
"g"<-floor(runif(6, 5,80))
)
names(df)=c("a","b","c","d","e","f","g")
以下工作正常:
> mapply(FUN=foo,df["a"],df["b"])
,但嘗試執行以下操作時遇到麻煩:
> mapply(FUN=foo,df["a"],cbind(df["b"],df["c"]))
對於如何更好地使用長度非常長的參數,或如何將參數傳遞給mapply的提示,我非常感謝!
這里有很多可能的修復。 從根本上講,您需要將第二個輸入變成mapply
成為一個列表,每個列表中都有兩個元素。 實現該目標的一種方法是執行以下操作:
tmp <- as.data.frame(t(df[c('b', 'c')]))
result <- mapply(FUN=foo,df["a"], tmp)
因為數據框是一個列表。 這將在df["a"]
和tmp
所有組合上運行該函數。 您想要的元素將沿着對角線( df['a']
的第一個元素與tmp的第一個元素,所以最終答案是
diag(result)
順便說一句,當您位於諸如data.frame
的函數中data.frame
,請使用=
代替<-
進行賦值。 您也不需要字母周圍的引號(它們將被忽略)。 所以你打電話給data.frame
應該看起來像
df<-data.frame(
a = floor(runif(6, 1,10)),
b = floor(runif(6, 18,80)),
c = floor(runif(6, 1,80)),
d = floor(runif(6, 100,800)),
e = floor(runif(6, 1000,4000)),
f = floor(runif(6, 1,10)),
g = floor(runif(6, 5,80))
)
這樣一來,您就可以避免在定義數據框后為它命名。
無需對角線通話即可更新
f1 <- function(x) {
if(length(x) ==2 ) x[1] * x[2]
else x[1] - x[2]*x[3]
}
apply(df[,c("a","b", "c")], 1, f1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.