2013-03-22 35 views
0

跨行代理我有一個類似這將創建一個數據框:創建方程函數中的R

dummy=data.frame(c(1,2,3,4),c("a","b","c","d"));colnames(dummy)=c("Num","Let") 
dummy$X1=rnorm(4,35,6) 
dummy$X2=rnorm(4,35,6) 
dummy$X3=rnorm(4,35,6) 
dummy$X4=rnorm(4,35,6) 
dummy$X5=rnorm(4,35,6) 
dummy$X6=rnorm(4,35,6) 
dummy$X7=rnorm(4,35,6) 
dummy$X8=rnorm(4,35,6) 
dummy$X9=rnorm(4,35,6) 
dummy$X10=rnorm(4,35,6) 
dummy$Xmax=apply(dummy[3:12],1,max) 

只有真實的東西是260個* 13000個細胞大致

什麼,我做的目的是實現下面各行等式中由數據定義的一組列的[X:X](在該示例的那些列內虛設[3:12])

TSP = SUM((1-(希/ Xmax))/(n-1))

其中X是感興趣的列中的行&內的每個單獨值(表示每列,即有一個X1,X2的,對於每一行的X3 ...的值),的Xmax是行中所有這些值中最大的那個(在粗糙的$ Xmax列中定義),n是選擇的列數(例如:n = 10)。在實際的數據集中,我將選擇26列。

我想創建一個整潔的小函數來執行這個計算並將每行的值存入一個名爲dummy $ TSP的列中,並且對於所有13000行都這樣做。

一個簡單的解決方案是以下內容,但正如我所說,我希望將其引入某種整潔的函數中,在那裏我可以選擇列,其餘的(幾乎)是自動的。

dummy$TSP<- ((((1-(dummy$X1/dummy$Xmax))/(10-1)) 
      +(((1-(dummy$X2/dummy$Xmax))/(10-1)) 
         ... 
      +(((1-(dummy$X10/dummy$Xmax))/(10-1))) 

我也很欣賞解釋過程的答案,所以我會更有可能學習,提前致謝!

回答

1

如果您知道要應用該功能的列可以,因爲您懷疑使用apply將函數應用於行,在您想要的列上應用;

# Columns you want to use for this function 
cols <- c(3:13) 

# Use apply to loop over rows 
dummy$TSP <- apply(dummy[,cols] , 1 , FUN = function(x){ sum((1 - (x/max(x)))/(length(x) - 1)) }) 

R的矢量化,所以當我們在apply傳遞一個行的函數(該行被作爲參數x這將是10個數字的向量通過),當我們執行某些操作ř假設我們想要對矢量的每個元素執行該操作。

因此,在第一個例子中,x/max(x)將返回10個數字的向量,它是該行每列的元素/該行的那些列的最大值。我們還將1 - x/max(x)的每個結果除以列數-1。然後,我們使用從函數返回的sum將這些結果整理爲一個值。

+0

1個非常感謝,有一個等式中的小錯誤(括號中沒有包含1-(x/xmax)部分),但是我已經編輯了答案,它現在可以工作了! – Ell 2013-03-22 17:37:33

+1

沒問題!但仔細看看你上面發佈的公式*。你有一個額外的大括號,所以我不知道該把它放在哪裏。 – 2013-03-22 17:38:39

+0

謝謝,我已經編輯了問題中的等式(星期五晚了很長時間之後,它肯定會發生!) – Ell 2013-03-22 17:45:48

1

更量化的解決方案是對所有元素執行內功能,然後用高效rowSums函數這樣執行每行的sum操作:

vars.to.use <- paste0("X", 1:10) 
dummy$TSP <- rowSums((1-(dummy[vars.to.use]/dummy$Xmax))/(length(vars.to.use) - 1)) 
+0

這不起作用,因爲用粘貼製作的矢量在「X」和數字之間留有空格,我的實際數據也是一系列單詞,我想在這種情況下它會是「vars.to.use < -c( 「var.a」, 「var.b」, 「GHE」, 「J45」 ...)「?感謝您的建議 – Ell 2013-03-23 09:55:58

+0

@ rg255而不是像我一樣使用'paste0',或者'paste(...,sep =「」)'並且您是對的,只需將'vars.to.use'替換爲列的名稱或列的索引。兩者都應該工作! – adibender 2013-03-23 12:16:54