2017-10-06 107 views
1

我對R和XTS相當陌生。請原諒混淆標題,下面的例子應該更好地說明我的問題。問題How to get value by column name in R?對我沒有多大幫助,也許是因爲我正在使用XTS對象。基於列名列名的新XTS列

我有一列字符串是XTS對象中其他列的名稱。

xts_bars <- structure(c("1", "1", "1", "1", "-1", "-1", "-1", "-1", "action4", 
"action4", "action", "action"), .indexCLASS = c("POSIXct", "POSIXt"), 
tclass = c("POSIXct", "POSIXt"), tzone = "", class = c("xts", "zoo"), 
index = c(1506620100, 1506620400, 1506620700, 1506621000), .Dim = c(4L, 3L), 
.Dimnames = list(NULL, c("action", "action4", "column_names"))) 

我想創建一個新的列,並填充每行的命名列中的每一行的值。

xts_bars$column_names 
xts_bars$new_column = xts_bars[,xts_bars$column_names] 

這不是工作,這是 'NEW_COLUMN' 列前創建3個額外的列:

    action action4 column_names action4.1 action4.2 action.1 new_column 
2017-09-28 12:35:00 "1" "-1" "action4" "-1"  "-1"  "1"  "1"  
2017-09-28 12:40:00 "1" "-1" "action4" "-1"  "-1"  "1"  "1"  
2017-09-28 12:45:00 "1" "-1" "action"  "-1"  "-1"  "1"  "1"  
2017-09-28 12:50:00 "1" "-1" "action"  "-1"  "-1"  "1"  "1" 

的 'NEW_COLUMN' 一欄包含-1,-1,1,1

+0

雖然有時會說「一張圖片勝過千言萬語」,但這並不適用於數據圖片。請提供[可重現的示例](https://stackoverflow.com/q/5963269/271616)。您的數據圖片不是xts對象。你不能在xts對象中混合類型,而xts對象沒有「Date」列。 –

+0

@JoshuaUlrich在您的IBrokers包中write.zoo()XTS對象時,「Date」列是CSV文件。關於不在XTS對象中混合類型的注意事項,在RStudio中,添加字符串列時遇到了NA強制警告,但是當我第二次運行該行時,它強制它進入XTS對象,並且在課後仍然顯示了xts/zoo (xts_bars)。 – sshemtov

回答

0

首先想到的是使用矩陣來將對象子集。您目前不能執行matrix subsetting on xts objects,但可以使用coredata()來提取基礎矩陣。

首先,您需要構建您將用於子集xts對象的矩陣。每行需要兩列。第一列是要提取的元素的行號,第二列是要提取的元素的列號。你可以將每行想象成ij對,你想要的元素在提取的向量中。

由於您想按列名提取,您需要找到與每個名稱對應的列號。你可以用match()函數來做到這一點。行號只是1:nrow(xts_bars)

# Find the value in xts_bar$column_names in colnames(xts_bars) 
col_nums <- match(xts_bars$column_names, colnames(xts_bars)) 
# Create subset matrix 
subset_matrix <- cbind(1:nrow(xts_bars), col_nums) 

現在您需要使用subset_matrix將您的xts對象子集。由於目前不可能,您可以使用coredata()來提取底層矩陣,然後使用子集。

# Create new column 
xts_bars$new_column <- coredata(xts_bars)[subset_matrix] 
xts_bars 
#      action action4 column_names new_column 
# 2017-09-28 12:35:00 "1" "-1" "action4" "-1"  
# 2017-09-28 12:40:00 "1" "-1" "action4" "-1"  
# 2017-09-28 12:45:00 "1" "-1" "action"  "1"  
# 2017-09-28 12:50:00 "1" "-1" "action"  "1" 
+0

甚至可以在比樣本數據更多的列上工作。也感謝您編輯我的問題,這對我今後的問題是有幫助的。我試着對你的答案進行投票,但因爲我是新手,所以沒有註冊。也許別人可以爲我投票贊成。謝謝! – sshemtov

+0

@sshemtov:很高興幫助!感謝您對我提出的可複製示例的要求做出積極迴應;它使你更容易幫助你。儘管您可能無法投票,但您仍然可以通過點擊複選標記來接受我的答案。這會讓其他人知道你的問題已經得到了滿意答覆。 –

+0

剛剛接受答案沒有看到複選標記,再次感謝! – sshemtov