2017-02-14 3 views
0

私は1つの観測と136の変数からなるデータフレームを持っています。各変数は、異なるセットの固有の組み合わせであり、観測は、2つのセットのそれぞれの間の収束スコアである。元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), "_"))) 

その後、私は行列の各エントリに割り当てるために続行する方法がわかりませんコーラル列名に基づくrect値。

答えて

1

と一つの選択肢です。 我々は最初の最初の2つの列が二組あり、3番目の列は、対応する値である、あなたのデータフレーム

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 

を再定義します。 行列が必要なので、「2通り」を意味します。私たちは、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 

最後に2つのデータフレームを組み合わせて、あなたの迅速な応答を@akrun 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

は、ここで私はreshapeパッケージからcast機能を示唆しています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

感謝を使うに切り替えます。残念ながら、私の元のデータフレームでは動作しません。私はエラーと警告を受け取ります。エラーは**重複する識別子**であり、警告は** 62箇所の値が多すぎます**。私はなぜ各セットの組み合わせがユニークであるかを理解していない。 – Rijak

+0

@ Rijakそれはあなたの重複した要素は、例ではユニークであるのに対し、再現可能な例を示してください – akrun

+0

申し訳ありません。 @ TooYoungによって提供されるもう1つのソリューションは正常に動作します。私の元のdfの変数/列の名前は例のようにsetA_setBではないが、より複雑な名前(カテゴリA、B、またはCの最後は使用しない)のため、あなたのソリューション(特に洗練されている) 。私はあなたのコードを "_"で区切られた任意のタイプの名前に一般化していると思います。 – Rijak

関連する問題