2016-06-21 1 views
1

Мне нужно использовать любую из применяемых функций в моем коде, а не для цикла. Ниже приведены примеры кода и функций.R: Как использовать функцию приложения в нижнем коде вместо цикла

Вот мои данные

testdata<-data.table(x1=sample(1000),y1=sample(1000),x2=sample(1000),y2=sample(1000),h=sample(1000)) 

Вот моя функция

testfunction<-function(x0,y0,x1,y1,x2,y2,h){ 
    x<-x0+x1+x2+y0+y1+y2 
    y<-x+x0+y0 
    d<-x+y 
    R<-x+y+d 
    result <- data.frame(d,R,x,y) 
    return (result) 
} 

мой текущий код с для петли

resultdf<-data.frame(d=NA,R=NA,x=NA,y=NA) 
for (i in 1:nrow(reqdata.LN)){ 
    resultdf[i,]<-testfunction(x0=1.2,y0=2.1,testdata$x1[i],testdata$x2[i], 
           testdata$y1[i],testdata$y2[i],testdata$h[i]) 
} 

Я попытался с помощью lapply и sapply, но есть несколько ошибок

bb<-lapply(1:nrow(testdata),testfunction,x0=1.2,y0=2.1,testdata$x1[i],testdata$x2[i], 
      testdata$y1[i],testdata$y2[i],testdata$h[i]) 

Может кто-нибудь сказать, как использовать это применимые функции.

ответ

5

Как у нас есть data.table, функция может быть непосредственно применена как +.

res <- testdata[, testfunction(x0=1.2, y0=2.1, x1, y1, x2, y2, h)] 
head(res) 
#  d  R  x  y 
#1 3923.9 7847.8 1960.3 1963.6 
#2 2689.9 5379.8 1343.3 1346.6 
#3 4523.9 9047.8 2260.3 2263.6 
#4 3535.9 7071.8 1766.3 1769.6 
#5 3183.9 6367.8 1590.3 1593.6 
#6 3677.9 7355.8 1837.3 1840.6 

ПРИМЕЧАНИЕ: Функция в столбце OP возвращает data.frame. Когда мы используем data.table, то лучше вернуть его как list, так что это будет data.table объект

testfunction<-function(x0,y0,x1,y1,x2,y2,h){ 
    x<-x0+x1+x2+y0+y1+y2 
    y<-x+x0+y0 
    d<-x+y 
    R<-x+y+d 
    list(d= d,R=R,x= x,y = y) 

} 

head(testdata[, testfunction(x0=1.2, y0=2.1, x1, y1, x2, y2, h)]) 
#  d  R  x  y 
#1: 3923.9 7847.8 1960.3 1963.6 
#2: 2689.9 5379.8 1343.3 1346.6 
#3: 4523.9 9047.8 2260.3 2263.6 
#4: 3535.9 7071.8 1766.3 1769.6 
#5: 3183.9 6367.8 1590.3 1593.6 
#6: 3677.9 7355.8 1837.3 1840.6 
+0

Благодаря akrun. На самом деле вышеприведенная функция является примером, и она показывает тот же результат как для цикла, так и для кода data.table. Но с моей фактической функцией он дает разные результаты для цикла loop и вашего кода таблицы данных. У вас есть представление об этом. – PPC

+0

@PPC Функция, созданная с помощью '+', векторизована. Ваша фактическая функция может быть не так. Возможно, вам придется создать новый пост с функцией, которая имитирует исходную проблему. – akrun

+0

Да, моя фактическая функция не так проста и сложна. Данные конфиденциальны, поэтому я не могу поделиться им. Есть ли способ передать каждый элемент строки для функции с помощью применяемых функций. – PPC