我有一个字符向量。向量的每个元素都有一个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"))
我的实际矢量非常大,所以我希望有效地做到这一点。
答案 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}}