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

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") 我的实际向量非常大,因此我希望能够有效地

我有一个字符向量。向量的每个元素都有一个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") 

我的实际向量非常大,因此我希望能够有效地执行此操作。

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

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”)相同的输出。
谢谢。我已经修好了。