[英]Reshaping a data frame based on column names
我有一個包含1個觀察值和136個變量的數據框。 每個變量是不同集合的唯一組合,觀察結果是兩個集合之間的收斂分數。 原始df的簡化版本如下所示:
#Original df
mydf <- data.frame(setA_setB = c(11), setA_setC = c(21), setB_setC = c(31))
mydf
我想要得到的是一個看起來像這樣的數據框:
#Final df
final.mydf <- data.frame(set = c("setA", "setB", "setC"), setA = c(NA, 11, 21), setB = c(11, NA, 31), setC = c(21, 31, NA))
final.mydf
因此,有必要先創建將mydf的colname分隔為“ _”的列名和行名,而我一直使用以下代碼進行此操作:
#List of set names:
setNames <- unique(unlist(strsplit(colnames(mydf), "_")))
然后,我不知道如何根據列名為矩陣的每個條目分配正確的值。
這是tidyverse
一種選擇
library(tidyverse)
data_frame(key = c(names(mydf), sub("(\\w+)_(\\w+)", "\\2_\\1", names(mydf))),
val = rep(unlist(mydf), 2)) %>%
separate(key, into = c("set", "key2")) %>%
spread(key2, val)
# A tibble: 3 × 4
# set setA setB setC
#* <chr> <dbl> <dbl> <dbl>
#1 setA NA 11 21
#2 setB 11 NA 31
#3 setC 21 31 NA
我建議的cast
從功能reshape
包。 我們首先重新定義您的數據框
redf <- data.frame(cbind(do.call(rbind,(strsplit(names(mydf),"_"))),t(mydf)),stringsAsFactors = F)
names(redf) <- c("set1","set2","value")
redf
# set1 set2 value
# setA_setB setA setB 11
# setA_setC setA setC 21
# setB_setC setB setC 31
前兩列是兩組,第三列是相應的值。 由於您需要一個矩陣,因此表示“雙向”。 我們切換set1和set2
invdf <- subset(redf,set1!=set2)
names(invdf) <- c("set2","set1","value")
invdf
# set2 set1 value
# setA_setB setA setB 11
# setA_setC setA setC 21
# setB_setC setB setC 31
最后結合兩個數據框並使用cast
alldf <- rbind(redf,invdf)
alldf$value <- as.numeric(alldf$value)
alldf
library(reshape)
cast(alldf,set1~set2,sum)
# set1 setA setB setC
# 1 setA 0 11 21
# 2 setB 11 0 31
# 3 setC 21 31 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.