3

データ フレーム内の 1 つの列を、元の列の値を新しい列名として保持する複数の列に分割しようとしています。次に、元のそれぞれの列に出現があった場合は、新しい列に 1 を指定し、一致しない場合は 0 を指定します。これは説明するのに最適な方法ではないことを認識しています。たとえば、次のようになります。

df <- data.frame(subject = c(1:4), Location = c('A', 'A/B', 'B/C/D', 'A/B/C/D'))  

#   subject Location  
# 1       1     A                                  
# 2       2     A/B                                   
# 3       3     B/C/D                                 
# 4       4     A/B/C/D

1 と 0 (または T と F) を使用して、次のようなワイド フォーマットに展開したいと考えています。

#   subject    A  B  C  D
# 1       1    1  0  0  0
# 2       2    1  1  0  0
# 3       3    0  1  1  1
# 4       4    1  1  1  1  

私は関数と関数tidyrを調べましたが、論理値を与えることに夢中になっているようです。この問題に関するヘルプは大歓迎です。ありがとうございました。separatereshape2cast

4

2 に答える 2

1

次の段階的なアプローチを取ることができます。

## get the unique values after splitting
u <- unique(unlist(strsplit(as.character(df$Location), "/")))
## compare 'u' with 'Location' 
m <- vapply(u, grepl, logical(length(u)), x = df$Location)
## coerce to integer representation
m[] <- as.integer(m)
## bind 'm' to 'subject'
cbind(df["subject"], m)
#   subject A B C D
# 1       1 1 0 0 0
# 2       2 1 1 0 0
# 3       3 0 1 1 1
# 4       4 1 1 1 1
于 2015-01-21T21:35:47.113 に答える