首页 文章

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

提问于
浏览
1

我有一个人物矢量 . 向量的每个元素都有一个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")

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

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

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

4 回答

  • 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"
    
  • 2

    在后缀值上拆分 a 并将其强制转换为数据框 . 忽略

    • stringsAsFactors=FALSE 如果您更喜欢因子列 .

    • unname 如果结果上的rownames是可接受的

    码 -

    as.data.frame(split(unname(a), sub(".*[.]", "", names(a))), stringsAsFactors = FALSE)
    

    赠送:

    X1  X2
    1 foo bar
    2 dog cat
    
  • 1

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

    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

    我们可以使用 dplyrtidyr . 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)
    

相关问题