基于列名称列中的列名称的新XTS列

时间:2017-10-06 05:37:13

标签: r xts

我对R和XTS相当新。原谅令人困惑的标题,下面的例子应该更好地说明我的问题。问题How to get value by column name in R?对我帮助不大,可能是因为我正在使用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&#39;之前创建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"  

&#39; new_column&#39;列应包含-1,-1,1,1。

1 个答案:

答案 0 :(得分: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"