2017-10-06 109 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