R 使用属性值将命名向量转换为数据帧
我有一个字符向量。向量的每个元素都有一个name属性,该属性表示数据帧的行索引和数据帧的列索引,以句点分隔。这是一个玩具数据集:R 使用属性值将命名向量转换为数据帧,r,string,attributes,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") 我的实际向量非常大,因此我希望能够有效地
# 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")
我的实际向量非常大,因此我希望能够有效地执行此操作。您可以使用按行/列值进行索引来有效地执行此操作:
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"
row.nums您可以使用按行/列值索引来高效地执行此操作:
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"
row.nums在后缀值上拆分a
,并将其强制为数据帧。省略
stringsAsFactors=FALSE
如果您更喜欢因子列李>
- 如果结果上的行名是可接受的,
unname
代码--
给予:
X1 X2
1 foo bar
2 dog cat
在后缀值上拆分a
,并将其强制为数据帧。省略
stringsAsFactors=FALSE
如果您更喜欢因子列李>
- 如果结果上的行名是可接受的,
unname
代码--
给予:
X1 X2
1 foo bar
2 dog cat
我可能会使用正则表达式提取行和列的位置,如下所示
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
my.rows我可能会使用regex提取行和列的位置,如下所示
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
my.rows我们可以使用dplyr
和tidyr
<代码>b2
是最终输出
library(dplyr)
library(tidyr)
b <- data_frame(Name = names(a), Value = a)
b2 <- b %>%
separate(Name, into = c("Group", "Var")) %>%
spread(Var, Value) %>%
select(-Group)
库(dplyr)
图书馆(tidyr)
b%
价差(风险值、价值)%>%
选择(-组)
我们可以使用dplyr
和tidyr
<代码>b2
是最终输出
library(dplyr)
library(tidyr)
b <- data_frame(Name = names(a), Value = a)
b2 <- b %>%
separate(Name, into = c("Group", "Var")) %>%
spread(Var, Value) %>%
select(-Group)
库(dplyr)
图书馆(tidyr)
b%
价差(风险值、价值)%>%
选择(-组)
我认为您需要更改此部分:sub(“*..]”)
以获得与data.frame(var1=c(“foo”、“dog”)、var2=c(“bar”、“cat”)相同的输出。
谢谢。已修复。我认为您需要更改此部分:sub(“*..]”)
以获得与data.frame(var1=c(“foo”、“dog”)、var2=c(“bar”、“cat”)相同的输出。
谢谢。我已经修好了。