使用属性值将命名向量转换为数据框

时间:2017-08-11 20:53:56

标签: r string attributes

我有一个字符向量。向量的每个元素都有一个name属性,它表示数据帧的行索引和数据帧的列索引,用句点分隔。这是一个玩具数据集:

# Create vector of characters
a <- c("foo","bar","dog","cat")

# Assign attributes. The data frame is 2x2:
attr(a, "names") <- c("1.1", "1.2", "2.1", "2.2") 

我试图使用属性名称将向量转换为数据框,其中数据框中的每个元素都是向量中的值,元素的行是属性中句点之前的数字name和元素的列是属性名称中小数点后面的数字。玩具示例的输出应如下所示:

data.frame(var1 = c("foo","dog"), var2 = c("bar", "cat"))

我的实际矢量非常大,所以我希望有效地做到这一点。

3 个答案:

答案 0 :(得分:3)

您可以按行/列值使用索引来有效地执行此操作:

row.nums <- as.numeric(sapply(strsplit(names(a), "\\."), "[", 1))
col.nums <- as.numeric(sapply(strsplit(names(a), "\\."), "[", 2))
mat <- matrix(NA, max(row.nums), max(col.nums))
mat[cbind(row.nums, col.nums)] <- a
mat
#      [,1]  [,2] 
# [1,] "foo" "bar"
# [2,] "dog" "cat"

答案 1 :(得分:2)

在后缀值上拆分unname并将其强制转换为数据框。省略

    如果您更喜欢因子列,请
  • as.data.frame(split(unname(a), sub(".*[.]", "", names(a))), stringsAsFactors = FALSE)
  • X1 X2 1 foo bar 2 dog cat 如果结果上的rownames可以接受

代码 -

my.rows <- as.integer(gsub("\\..*$", "", names(a)))
my.cols <- as.integer(gsub("^.*\\.", "", names(a)))
new.data <- data.frame(matrix(NA, nrow = max(my.rows), ncol = max(my.cols)))
for (i in 1:length(a)) {
  new.data[my.rows[i], my.cols[i]] <- a[i]
}
new.data

,并提供:

{{1}}

答案 2 :(得分:1)

我可能会使用正则表达式来提取行和列位置,如下所示。

{{1}}