2017-02-14 76 views
0

我有一個由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的colnames在「_」,我一直在用下面的代碼這樣做:

#List of set names: 
setNames <- unique(unlist(strsplit(colnames(mydf), "_"))) 

然後,我不知道如何才能分配到矩陣的每個條目進行COR基於列名的矩形值。

回答

1

我從reshape包暗示cast功能的一個選項。 我們首先重新定義你的數據幀

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 

前兩列是兩個集和第三列是相應的值。 既然你想要一個矩陣,這意味着「雙向」。我們切換設置1和設置2

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 
+0

非常感謝@TooYoung。你的解決方案工作得很好。 – Rijak

2

這裏是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 
+0

感謝@akrun您的及時回覆。不幸的是,它不適用於我的原始數據框。我收到錯誤和警告。錯誤是**行**的重複標識符,並且警告是** 62個位置處的值太多**。我不明白爲什麼,因爲每個組合都是獨一無二的。 – Rijak

+0

@Rijak它說你的重複元素,而在這個例子中它是唯一的。請顯示一個可重複的例子 – akrun

+0

對不起。 @TooYoung提供的另一種解決方案工作正常。我認爲你的解決方案(尤其是光滑的)不起作用,因爲我原來的df中的變量/列的名稱不像示例中那樣是setA_setB,而是更復雜的名稱(末尾沒有類別A,B或C) 。我想你的代碼概括爲任何類型的名稱分隔「_」將工作。 – Rijak

相關問題