1

私はRを初めて使用し、このすばらしいWebサイトで他の質問を調べることから多くのことを学びました。

でも今は他の例ではわからないデータ管理の問題を扱っているので、お役に立てれば幸いです。

csvファイルから読み込んで、次の例のようにフォーマットされたベクトルにラングリングした一連の調査回答があります。

test <- c(
  "[1234],Bob Smith,",
  "Q-0,Male",
  "Q-1,18-25",
  "Q-2,Computer Science",
  ",",
  "[5678],Julie Lewis",
  "Q-0,Female",
  "Q-1,18-25",
  ",",
  ","
)

すべての行が同じ長さではないという事実に対処するために使用した","ため、それは独自の行に表示されることに注意してください。また、すべての回答者がすべての質問に回答しているわけではないことにも注意してください。fill=TRUEread.csv

これを次の構造のデータフレームに変換する必要があります。

     ID      name         gender   age    major
1    [1234]  Bob Smith    Male     18-25  Computer Science
2    [5678]  Julie Lewis  Female   18-25  NA
   ...

すべての質問にすべての回答者が回答したわけではないため、ベクトルを行ごとにマトリックスまたはデータフレームに読み込むことができないようです。これに対処する方法について何かアドバイスはありますか?

4

2 に答える 2

2

そもそも csv ファイルを正しい形式で読み取るための多くの手間を省くことができるでしょう。read.csvは強力な関数であり、データに対処できる必要があり、この変更は必要ありません。

ただし、次のようになります。

x <- matrix(test, byrow=TRUE, ncol=5)
x <- x <- sub("Q-\\w+,", "", x)
x[x==","] <- NA
x <- cbind(matrix(unlist(strsplit(x[, 1], ",")), byrow=TRUE, ncol=2), x[, -1])
x <- as.data.frame(x, stringsAsFactors=FALSE)
names(x) <- c("ID", "Name", "Gender", "Age", "Major", "V1")

これにより、次の結果が得られます。

x

      ID        Name Gender   Age            Major   V1
1 [1234]   Bob Smith   Male 18-25 Computer Science <NA>
2 [5678] Julie Lewis Female 18-25             <NA> <NA>
于 2012-06-24T05:46:27.193 に答える
0

これは少し不格好ですが、うまくいきます。

データは次のとおりです。

test <- c(
"[1234],Bob Smith,",
"Q-0,Male",
"Q-1,18-25",
"Q-2,Computer Science",
",",
"[5678],Julie Lewis",
"Q-0,Female",
"Q-1,18-25",
",",
"[1234],Bob Smith,",
"Q-1,18-25",
"Q-2,Computer Science",
","
)

操作コードは次のとおりです。

#remove rows with just a comma
test <- test[test!=","]
#find id cases and remove the commas between the id and the name
#and add an id label
idcases <- grep("\\[.*\\]",test)
test[idcases] <- paste("id,",gsub(",","",test[idcases]),sep="")
#find id values positions and end position
idvals <- c(idcases,length(test)+1)
#generate a sequence identifier for each respondent
setid <- rep(1:(length(idvals)-1),diff(idvals))
#put the set id against each value
result1 <- paste(setid,test,sep=",")
#split the strings up and make them a data.frame
result2 <- data.frame(do.call(rbind,strsplit(result1,",")))
#get the final dataset with a reshape
final <- reshape(result2,idvar="X1",timevar="X2",direction="wide")[,-1]
#clean up the names etc
names(final) <- c("name","gender","age","major")
final$id <-  gsub("(\\[.*\\])(.*)","\\1",final$name)
final$name <- gsub("(\\[.*\\])(.*)","\\2",final$name)

これにより、次のことが得られます。

> final
         name gender   age            major     id
1   Bob Smith   Male 18-25 Computer Science [1234]
5 Julie Lewis Female 18-25             <NA> [5678]
8   Bob Smith   <NA> 18-25 Computer Science [1234]
于 2012-06-24T04:35:15.447 に答える