2013-01-14 79 views
1

我正在準備一個數據集以在程序rpy(R,它運行在Python中)中運行以進行統計分析。它看起來像這樣:在for循環中創建新的數組(Python)

data = [[0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 0, 0], 
[0, 1, 1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 1], 
[0, 0, 1, 1, , 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 1, 0]] 

我使用這個數據,我需要從獨立的人(x)的因變量(Y)隔離。我需要爲每年的每個列創建一個新列表,如下所示:

y = data[:,9] 
x1 = data[:,0] 
x2 = data[:,1] 
x3 = data[:,2] 
x4 = data[:,3] 
x5 = data[:,4] 
x6 = data[:,5] 
x7 = data[:,6] 
x8 = data[:,7] 
x9 = data[:,8] 
x10 = data[:,9] 

假設我的數據有67列。有沒有辦法循環遍歷所有列,並自動創建每一列,而無需輸入所有列?我不想硬編碼所有陣列沿此線長達67

的東西,但它不工作:

i=0 
for d in data: 
    "x%d"%i = data[:,i-1] 
    i+=1 

這是代碼的其餘部分:

rpy.set_default_mode(rpy.NO_CONVERSION) 
linear_model = rpy.r.lm(rpy.r("y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10"), data = rpy.r.data_frame(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,x7=x7,x8=x8,x9=x9,x10=x10,y=y)) 
rpy.set_default_mode(rpy.BASIC_CONVERSION) 
print linear_model.as_py()['coefficients'] 
summary = rpy.r.summary(linear_model) 
+1

您期待的輸出是什麼?問題很難遵循。 – Sibi

+0

我想自動創建x1 = data [:,1],x2 = data [:,2] ....不必硬編碼到x67 = data [:,67]。 – ono

+0

當你的因變量'y'被創建爲'y = x10'時,你確定要包含'x10'作爲一個獨立變量嗎? – lgautier

回答

3

爲什麼不嘗試這樣的事情轉置列:

x = [] 

for d in xrange(0,66): 
    x.append(data[:,d]) 

除非它是絕對必要的日在沒有對每個項目單獨的數據結構,雖然我不知道你爲什麼會需要單獨的數據strucures ...

編輯:如果不是這裏的東西應該工作正是你所描述的方法:

for d in xrange(1,68): 
    exec 'x%s = data[:,%s]' %(d,d-1) 
0

當你展示一些rpy代碼時,我想我可以展示它與rpy2的相似之處。

# build a DataFrame 
from rpy2.robjects.vectors import IntVector 
d = dict(('x%i' % (i+1), IntVector(data[:, i]) for i in range(68) if i != 9) 
d['y'] = data[:, 9] 
from rpy2.robjects.vectors import DataFrame 
dataf = DataFrame(d) 
del(d) # dictionary no longer needed 

# import R's stats package 
from rpy2.robjects.packages import importr 
stats = importr('stats') 

# fit model 
dep_var = 'y' 
formula = '%s ~ %s ' % (dep_var, '+'.join(x for x in dataf.names if x != dep_var)) 
linear_model = stats.lm(formula, data = dataf) 
+0

這工作。我的目標是獲得最終結果中的係數。但是,我得到的很多(67)是NaN。我如何解釋?我的數據有問題嗎? – ono

+0

這是因爲一些係數是不可估計的,可能是因爲一些自變量是其他自變量的線性組合。不知道更多關於確切的數據集,我認爲這看起來像很多獨立變量來適應線性模型。你確定你需要所有他們嗎?你嘗試過變量選擇嗎?這對於「交叉驗證」堆棧交換站點來說越來越成爲一個問題...... – lgautier

+0

那就很有道理了。 NaN變量不太重要。我注意到數據集越大,我收到的NaN係數就越少。我的目標是找出哪些變量是最重要的,所以我需要提供整個集合。我現在有數據擬合曲線y = Ax1 + Bx2 + Cx3 ....我想一個不同的方程,如邏輯可以更好地工作。我不確定。 – ono