1

「両方向」の a、b、および c のすべての可能な順列であるデータ フレームがあります。

df1<-data.frame("x"=c("a","a","b"),"y"=c("b","c","c"),"A"=1:3 ,"B"=4:6,"C"=0,"T"=10:12)
df2<-data.frame("x"=df1$y,"y"=df1$x, "A"=df1$A,"B"=df1$B,"C"=df1$C,"T"=df1$T)
df<-rbind(df1,df2)
  x y A B C  T
1 a b 1 4 0 10
2 a c 2 5 0 11
3 b c 3 6 0 12
4 b a 1 4 0 10
5 c a 2 5 0 11
6 c b 3 6 0 12

2番目の空のデータフレームを埋めるために使用したい

empty<-data.frame("x"=c("a","c"),"y"=c("b","a"),"A"=0,"T"=0)

  x y A T
1 a b 0 0
2 c a 0 0

それにより、次のものが生成されます。

filled<-data.frame("x"=c("a","c"),"y"=c("b","a"),"A"=1:2,"T"=10:11)

  x y A  T
1 a b 1 10
2 c a 2 11

私は幸運なしで for ループを試しました

for(i in 1:nrow(empty)
{
    if("x" == df$x && "y" == df$y)
    {
        empty[i,"A"]<-df$A 
        empty[i,"T"]<-df$T
    }
}

また、成功せずにマトリックスを埋めることに関する以前の投稿からの回答。どんなアドバイスでも大歓迎です。

4

2 に答える 2

2

使用できますmerge

merge(df[c("x","y","A","T")], empty[c("x","y")])
#   x y A  T
# 1 a b 1 10
# 2 c a 2 11

@mrdwab が指摘しているemptyように、最終データを保持するデータフレームを作成する必要はありません。代わりに、mergeあなたのためにそれをしましょう。必要なのは、(x,y)抽出したいペアの組み合わせを持つ data.frame だけです。

extract.keys <- data.frame(x = c("a","c"), y = c("b","a"))
merge(df[c("x","y","A","T")], extract.keys)
于 2012-08-18T13:34:32.893 に答える
2

コメントを「回答」に移動すると、これの最終目標が何であるかわかりません。私には、順列の概念が追加されたとしても、これはサブセット化の問題のように思えます。つまり、 " empty"の作成方法に関する予備知識がすでに存在する場合data.frame、そのオブジェクトを作成してマージし、直接サブセット化するステップを単純にスキップできます。

と が変数ととして 6 つの順列を与えることを考えるとa、と の組み合わせのみに関心があることがわかっているので、列 と を簡単に使用してテストできます。bxya+bc+apaste0()xy

df更新された質問からの使用:

df[paste0(df$x, df$y) %in% c("ab", "ca"), 
   names(df) %in% c("x", "y", "A", "T")]
#   x y A  T
# 1 a b 1 10
# 5 c a 2 11

もちろん、@ flodelの答えは問題なく機能しdata.frameますが、列と行のインデックスでサブセット化するだけで十分な場合に、記入するために空の作成に苦労する必要がある理由がわかりません。

アップデート

他にやらなければならない仕事があるので、いくつかのベンチマークを行うことにしました。結果は次のとおりです。

library(rbenchmark)
benchmark(subsetting = df[paste0(df$x, df$y) %in% c("ab", "ca"), 
                 names(df) %in% c("x", "y", "A", "T")],
          merge.keys = merge(df[c("x","y","A","T")], 
                    data.frame(x = c("a","c"), 
                               y = c("b","a"))),
          merge.empty = merge(df[c("x","y","A","T")], empty),
          columns = c("test", "replications", "elapsed",
                      "relative", "user.self"))
#          test replications elapsed relative user.self
# 3 merge.empty          100   0.321 6.294118     0.324
# 2  merge.keys          100   0.387 7.588235     0.384
# 1  subsetting          100   0.051 1.000000     0.048
于 2012-08-18T18:27:11.343 に答える