2014-11-23 5 views
2
df1 <- data.frame(
    name = c("a", "b", "b", "c"), 
    score = c(1, 1, 2, 1) 
    ) 

Как я могу получить новый фрейм данных с переменными/столбцами из ф.р. $ имени и с каждым «соответствующим» df$score. Я полагаю, что его на самом деле двухступенчатый проблема:R: структура кадра данных изменения, используя значения из одной переменных в качестве новой переменной

Сначала я должен был бы составить список (в данном примере) неравные векторов длины, как это:

$a 
[1] 1 

$b 
[1] 1 2 

$c 
[1] 1 

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

a b c 
1 1 1 1 
2 NA 2 NA 

Я не могу найти простой способ сделать это - я уверен, что должен быть! Если решение может быть доставлено с помощью dplyr, это будет фантастично! Благодаря!

+0

Это кажется как довольно прямолинейная переформатировка от длинного к большому корпусу. Взгляните на gazillinon сообщений по этой теме на SO. Поиск, например. 'reshape2' и' dcast'; 'tidyr' и' spread'. – Henrik

ответ

4

Чтобы разделить данные:

(s <- split(df1$score, df1$name)) 
# $a 
# [1] 1 
# 
# $b 
# [1] 1 2 
# 
# $c 
# [1] 1 

Чтобы создать новый фрейм данных:

as.data.frame(sapply(s, `length<-`, max(vapply(s, length, 1L)))) 
# a b c 
# 1 1 1 1 
# 2 NA 2 NA 

Чуть более эффективным было бы использовать vapply вместо sapply

len <- max(vapply(s, length, 1L)) 
as.data.frame(vapply(s, `length<-`, double(len), len)) 
# a b c 
# 1 1 1 1 
# 2 NA 2 NA 
+0

Ницца. Но имена 'sp' уже являются именами' s'? –

+0

О, да. Они уверены. Это еще лучше :) –

+0

Что делает «длина <-»? – user3375672