2013-12-13 5 views
0

d1 <- data.frame(Gender=c('M', 'M', 'M', 'M', 'F', 'F', 'F','F'), Age=c(15,38,17,35,26,24,20,26))Transform dataframe путем группировки строк

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

Gender Age 
    M 15, 38, 17, 35 
    F 26, 24, 20, 26 
+2

Вы должны сделать паузу, чтобы пересмотреть эту работу. Создание тактов данных «похоже» на конкретный выходной дисплей, вероятно, усложнит ситуацию в будущем. Первое, что вам нужно сделать, это определить, почему вы хотите отображать данные таким образом. –

ответ

2

Вы можете разделить по полу, а затем объединить в вашей строки, и, наконец, объединить:

spl = split(d1, d1$Gender) 
spl = lapply(spl, function(x) data.frame(Gender=x$Gender[1], 
             Age=paste(x$Age, collapse=", "))) 
result = do.call(rbind, spl) 
3

Если вы просто хотите, чтобы отобразить это, и я бы посоветовал не «трансформировать», вы можете сделать это:

with(d1, aggregate(Age, list(Gender=Gender), list)) 
    Gender    x 
1  F 26, 24, 20, 26 
2  M 15, 38, 17, 35 

Я заметил, что @Henrik удалил свой ответ, который использовал aggregate.formula, возможно, из-за моего ответа, который был бы неудачным, потому что я собирался удалить мой в пользу его. Это то, что он написал, и я думаю, что это лучше, чем у меня:

aggregate(Age ~ Gender, data = d1, function(x) paste(x, collapse = ", ")) 

Но быть в известность, что как это и ранее принятый ответ возвращают те стареют переменные в качестве факторов.

+0

Это правда. Я удалил свой ответ в пользу твоего. Я думал, что ваше решение «list» было хорошей альтернативой - сохранение первоначальных значений возраста и получение форматирования, о котором просили. +1! – Henrik

+0

О, хорошо. Думаю, я пойду, чтобы узнать несколько ответов на вопрос. –

1

Я добавлю необходимое plyr решения на основе:

library("plyr") 
ddply(d1, .(Gender), summarize, Age = paste(Age, collapse = ", ")) 
## Gender   Age 
## 1  F 26, 24, 20, 26 
## 2  M 15, 38, 17, 35 
Смежные вопросы