我对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。
答案 0 :(得分:0)
首先想到的是使用矩阵来对象进行子集化。您目前无法matrix subsetting on xts objects,但可以使用coredata()
提取基础矩阵。
首先,您需要构造将用于对xts对象进行子集化的矩阵。每行需要两列。第一列是要提取的元素的行号,第二列是要提取的元素的列号。您可以将每行视为提取的向量中所需元素的i
,j
对。
由于您要按列名提取,因此需要找到与每个名称对应的列号。您可以使用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"