列名列中基于列名的新 XTS 列
New XTS column based on column name in column of column names
我对 R 和 XTS 还很陌生。请原谅令人困惑的标题,下面的例子应该更好地说明我的问题。 How to get value by column name in R? 这个问题对我帮助不大,也许是因为我正在使用 XTS object。
我有一列字符串是 XTS 中其他列的名称 object。
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。
首先想到的是用矩阵对对象进行子集化。您目前无法执行 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"
我对 R 和 XTS 还很陌生。请原谅令人困惑的标题,下面的例子应该更好地说明我的问题。 How to get value by column name in R? 这个问题对我帮助不大,也许是因为我正在使用 XTS object。
我有一列字符串是 XTS 中其他列的名称 object。
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。
首先想到的是用矩阵对对象进行子集化。您目前无法执行 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"