2016-05-30 4 views
1

私はAPIから複数の数値を取得し、データフレームに入力する関数を持っています。私はデータフレームをこの関数にフックするためにapply関数を使い、すべての行についてこれを一度呼び出す必要があります。ここに私の再現性の例:R:r複数の値を適用するとき

# create data frame 
df = data.frame(Long=c(0.0, 0.0 , 0.0), Lat=c(0.0, 0.0, 0.0), c=c("test1", "test2", "test3")) 

# random number betweeen 1 and 10 
rand1 = function(){ 
    sample(1:10, 1) 
} 

# random number betweeen 1 and 10 
rand2 = function(){ 
    sample(100:500, 1) 
} 

# calls the "API" --- simplified with two random numbers coming from two functions 
callAPI = function(entry){ 
    entry[1] = rand1() 
    entry[2] = rand2() 
} 

# run my function 
df[,1] <- apply(df, 1, callAPI) 
df 

callAPIが第二の数(rand2から入手した乱数())との最初の列を上書きするようです。私がここで達成したいのは、操作の最後に変更されたデータフレームを持つように、データフレームに(rand1とrand2でシミュレートされた)どこかから得られた数字の任意のリストを格納することだけです。

一般的に、私は適用するのが非常に難しいと感じています。それは実際に悪い習慣であり、単純なforループを使用することはお勧めですか?

答えて

0

この関数は最後の値のみを返します。両方の値を返す必要があります。

callAPI <- function(entry){ 
    output <- c(rand1(), rand2()) 
    return(output) 
} 

apply(df, 1, callAPI) 2×nrow(DF)行列を返すが、あなたはnrow(DF)が2行列xは必要になります。したがってt()

df[, 1:2] <- t(apply(df, 1, callAPI)) 
関連する問題