簡體   English   中英

R:帶有向量參數的mapply

[英]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.

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