2

「リード」変数に従って変数を分離したい。次の場合は x3:

set.seed(2)
df = data.frame(x1 = sample(4), x2 = sample(4), x3 = sample(letters[1:2], size = 4, replace = TRUE))
df
#   x1 x2 x3
# 1  1  4  a
# 2  3  3  b
# 3  2  1  b
# 4  4  2  a

# Desired output
# x3 x1.a x2.a x1.b x2.b
#  a    1    4   NA   NA
#  b   NA   NA    3    3
#  b   NA   NA    2    1
#  a    4    2   NA   NA

私はどういうわけかこれを達成できると感じていreshape2::dcast()ますが、合計で2つの変数に対してしか機能させることができませんでした:

reshape2::dcast(df[,2:3], seq_along(x3) ~ x3, value.var = "x2")[, -1]
#    a  b
# 1  2 NA
# 2 NA  1
# 3 NA  3
# 4  4 NA

しかし、これは完全な悪用かもしれませんdcast。分割とマージを行わずに、この問題に対するエレガントな解決策はありdfますか?


編集:これを行うのは恐ろしい考えであり、おそらくそのようなことをすべきではないという人もいます。これがいつ意味を持つのかを詳しく説明しましょう。

Imaginex3は、特定のアルゴリズムのスイッチです。この場合a、 andbがオプションです。さらにx1、 とx2は、両方のアルゴリズムが取ることができるパラメーターです。残念ながら、両方のアルゴリズムは と の同じパラメーター設定でまったく異なる動作をするためx1x2相関関係がないことを考慮して、それらを別個の機能として扱うことは理にかなっています。

4

4 に答える 4

5

とのダミーの相互作用項の作成を使用したソリューションを次に示しX3ます。dplyrorを使用して、このすべてのコードを 1 行に収めることはおそらく可能ですが、次のようにdata.tableなります。

temp <- model.matrix( ~ (x1+x2):x3-1, df)
temp[model.matrix( ~ (I(x1+1)+I(x2+1)):x3-1, df) == temp] <- NA
data.frame(df$x3, temp)
####  df.x3 x1.x3a x1.x3b x3a.x2 x3b.x2
####      a      1     NA      4     NA
####      b     NA      3     NA      3
####      b     NA      2     NA      1
####      a      4     NA      2     NA

列の最終的な名前と順序は、あなたとは少し異なります。

: (コードの 2 行目の目的)。model.matrix関数は の代わりにゼロを作成するためNAs、既存のゼロとの違いを見分ける方法はありません。2 行目は、最終的な NA のみを見つけるためのトリックです ( によって値を変更しながら、2 番目のモデル マトリックスを作成することによって機能します+1)。

于 2016-09-26T15:42:12.740 に答える
3

これは、 and を使用して、もう 1 つの列を追加して仲介を行う場合に実現meltできdcastますmelt

library(reshape2)
library(magrittr)

set.seed(2)
df = data.frame(x1 = sample(4), x2 = sample(4), x3 = sample(letters[1:2], size = 4, replace = TRUE))

df$row <- 1:nrow(df)

melt(df, 
     id.vars = c("row", "x3"), 
     measure.vars = c("x1", "x2")) %>%
  dcast(row ~ x3 + variable, 
        value.var = "value")

ただし、データ フレームのサイズを 10,000 行に増やしても、agenis のソリューションよりも 2 ~ 3 倍遅くなります。(8 対 16 ミリ秒)。

于 2016-09-26T15:59:58.463 に答える
1

あなたが使用することができますtidyr

library(tidyr);library(dplyr)
df <- df %>% mutate(rows=rownames(.)) %>% 
gather(., key="vars", value= "val", -x3,-rows) %>%
    mutate(vars= paste(x3,vars, sep=".")) %>%  
spread(., key = vars, value = val) %>%
select(-rows)

データセットを収集して x3 変数を分離した長い形式にし、必要な変数ヘッダーを作成した後、データを再び展開します。

于 2016-09-26T16:39:29.953 に答える