2012-06-24 4 views
1

Я новичок в R и многому учусь, изучая другие вопросы здесь, на этом прекрасном сайте!R: преобразование списка со встроенными идентификаторами в фрейм данных

, но теперь я имею дело с проблемой управления данными, которую я не могу понять из других примеров, поэтому я надеюсь, что вы можете помочь.

У меня есть набор ответов обследования, которые я прочитал из файла 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=TRUE в read.csv, чтобы иметь дело с тем, что не все линии имели одинаковую длину. Также обратите внимание, что все респонденты ответили не на все вопросы.

мне нужно, чтобы превратить это в кадр данных в следующей структуре:

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

Кажется, что я не могу прочитать вектора в матричном или данных кадра по строкам из-за того, что не все ответы на все вопросы ответили. Любые советы о том, как с этим бороться?

+3

если вы измените свой вопрос и добавить некоторые примеры данных, которые легко вырезать и вставить в R терминал, я уверен, вы получите несколько хороших ответов через несколько минут. В его нынешнем виде трудно понять структуру ваших данных. Вы можете дать вставить результаты 'dput (head (yourDataStructure))' в вопрос, и тогда у нас будут точно такие же данные, с которыми вы работаете. Другие полезные советы [здесь] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Одна вещь, которую я не вижу в ваших примерах, - это заголовки столбцов, предположим, вы добавите их позже? – Chase

+2

@ Предложения Chase хорошие, но я бы добавил запрос на структуру необработанного CSV, который вы пытаетесь прочитать. –

+0

спасибо всем за подробные ответы и предложения о том, как наиболее полезно задавать вопросы! У меня теперь есть много работы, очень ценю это. – elfs

ответ

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] 
+0

хорошая стратегия для устранения недостающих значений для некоторых респондентов – elfs

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> 
+0

Не будет ли это падать, если на человека есть разные количества строк? Это была главная причина, по которой моя попытка была гораздо более неприятной. Я предполагал, что ручного добавления строк и очистки электронной таблицы пытались избежать. – thelatemail

+0

@thelatemail Возможно, но я предположил, что у каждого человека одинаковое количество строк. Это то, что вы получите из дампа опроса в файл csv. – Andrie

+0

Я не принимаю ничего, проведя вчера все вчера, вручную исправляя базу данных данных опроса, которые имели непоследовательное форматирование. :-P – thelatemail

Смежные вопросы