0

data.frame DATの形式の文字列を含む 8 つの列があります (これらは、クイズの 8 つの質問に対する多肢選択式の回答です)。

  Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8
1 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
2 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
3 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
4 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
5 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
6 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,

以下のように変換したいと思います。

 q11 q12 q13 q21 q22 q23 q31 q32 q33 q41 q42 q43 q51 q52 q53 q61 q62 q63 q71 q72 q73 q81 q82 q83
1   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0
2   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0
3   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0
4   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0
5   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0
6   0   0   1   0   0   1   0   1   0   1   0   0   0   0   1   0   0   1   0   1   0   1   0   0

そこで、次のコードを書きます。

NAMES.Q = paste(rep("Q",8), c(1:8), sep="") 
DAT[ which(DAT[NAMES.Q]=="NULL"),]<- NA # to set to NA skipped questions
NAMES.q  = paste(rep("q",8), c(1:8), sep="") 

0次のコードは、文字列を1数値に変換するものです。

q1 <- read.csv(text = as.character(DAT[,"Q1"]), strip.white = TRUE)
q2 <- read.csv(text = as.character(DAT[,"Q2"]), strip.white = TRUE)
q3 <- read.csv(text = as.character(DAT[,"Q3"]), strip.white = TRUE)
q4 <- read.csv(text = as.character(DAT[,"Q4"]), strip.white = TRUE)
q5 <- read.csv(text = as.character(DAT[,"Q5"]), strip.white = TRUE)
q6 <- read.csv(text = as.character(DAT[,"Q6"]), strip.white = TRUE)
q7 <- read.csv(text = as.character(DAT[,"Q7"]), strip.white = TRUE)
q8 <- read.csv(text = as.character(DAT[,"Q8"]), strip.white = TRUE)
names(q1) = paste("q1", 1:3, sep = "")
names(q2) = paste("q2", 1:3, sep = "")
names(q3) = paste("q3", 1:3, sep = "")
names(q4) = paste("q4", 1:3, sep = "")
names(q5) = paste("q5", 1:3, sep = "")
names(q6) = paste("q6", 1:3, sep = "")
names(q7) = paste("q7", 1:3, sep = "")
names(q8) = paste("q8", 1:3, sep = "")
q1[is.na(q1)] <- 0
q2[is.na(q2)] <- 0
q3[is.na(q3)] <- 0
q4[is.na(q4)] <- 0
q5[is.na(q5)] <- 0
q6[is.na(q6)] <- 0
q7[is.na(q7)] <- 0
q8[is.na(q8)] <- 0
qs<-cbind(q1, q2, q3, q4, q5, q6, q7, q8) 

コードは機能しますが、読み取りと保守が非常に難しいと思います。

data.frame新しいdata.frame. _

4

2 に答える 2

1

まず、 でデータを読み込みますread.table。のデフォルトのフィールド区切り文字read.tableは「空白」、つまり、連結された「Q」列間の区切り文字です。

splitstackshape次に、パッケージの関数を使用してconcat.split.multiple、連結された列を分割できます。split.cols分割が必要な列を指定しないと、すべての列が分割されます。seps各列で使用されるデフォルトの区切り文字 ( ) は です。結果のデータ フレームの,デフォルトの形状 ( direction) は「ワイド」です。したがって、この場合、データ フレームの名前のみを指定する必要があります。

df <- read.table(text="  Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8
1 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
2 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
3 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
4 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
5 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,
6 ,,1 ,,1 ,1, 1,, ,,1 ,,1 ,1, 1,,", header=TRUE)

library(splitstackshape)

# split columns
df2 <- concat.split.multiple(df)

# or explicitly writing out the arguments
df2 <- concat.split.multiple(data = df, split.cols = names(df), seps = ",")

# replace NA with 0
df2[is.na(df2)] <- 0
df2

#   Q1_1 Q1_2 Q1_3 Q2_1 Q2_2 Q2_3 Q3_1 Q3_2 Q3_3 Q4_1 Q4_2 Q4_3 Q5_1 Q5_2 Q5_3 Q6_1 Q6_2 Q6_3 Q7_1 Q7_2 Q7_3 Q8_1 Q8_2 Q8_3
# 1    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
# 2    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
# 3    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
# 4    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
# 5    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
# 6    0    0    1    0    0    1    0    1    0    1    0    0    0    0    1    0    0    1    0    1    0    1    0    0
于 2013-11-12T19:12:59.233 に答える