2013-02-28 63 views
1

的內容我有一個SAS數據集是這樣的:SAS - 分配域作爲另一場

領域:A1 | A2 | A3 | A4 | A5 | A6 | INDEX | B ...

INDEX字段包含一個變量名:A1或A2或...或A6

我想B具有在INDEX字段中的字段的內容。

如何動態分配字段B作爲INDEX字段中指定的字段?

回答

3

解決此問題的一個相當簡單的方法是使用數組和VNAME。

data have; 
input a1 a2 a3 index $; 
datalines; 
1 2 3 a1 
2 3 4 a2 
3 4 5 a3 
4 5 6 a1 
5 6 7 a3 
;;;; 
run; 

data want; 
set have; 
array as a1-a3; 
do _t = 1 to dim(as); 
if upcase(vname(as[_t])) = upcase(index) then b = as[_t]; 
end; 
run; 

您可以在添加LEAVE語句,如果(使它成爲一個如果...然後做塊),如果你有一個非常大的陣列來提高性能。

+0

這不是一個有效的SAS變量名稱。如果這是變量_label_,那麼您可以使用VLABEL而不是VNAME。 – Joe 2013-02-28 17:04:14

+0

我理解Joe,唯一的問題是我的字段是「BU節點級別N長名稱」,N從1到29. B例如具有「BU節點級別14長名稱」。 如何在這種情況下使用數組,並使用長命名字段? 謝謝 – Acci 2013-02-28 17:04:48

+1

該示例應該完全按照原樣工作,除了交換VLABEL的VNAME。如果你想更容易編寫數組語句,你可以使用:'array vars BU_Node_Level:'(或者你的實際變量名是結構化的),或者甚至是'array vars _numeric_;'來檢查所有的數值變量,如果是不是太多的過量變量(它不應該與任何不匹配,因爲它只會發現一個匹配正確的東西)。 – Joe 2013-02-28 17:11:08