2013-12-18 4 views
3

У меня есть набор данных:Перестройка кадра данных, чтобы создать список уникальных значений в столбце

df <- data.frame(g = c("X", "X", "Y", "Z", "Y", "Z", "Z"), 
       r = c("A", "B", "C", "C", "A", "A", "A")) 

И я бы манипулировать данные таким образом, что я получаю результат:

г | r
X | A B
Y | A C
Z | A C

Итак, для каждого g перечислены все уникальные значения r. Для этого я могу использовать пакет reshape. Но я хотел бы быть в состоянии сделать это со стандартным R, так как скрипт будет совместно с людьми, с очень ограниченным знанием Р.

ответ

2

Как насчет aggregate()?

aggregate(df$r , by = list(df$g) , function(x) paste0(sort(unique(x)) , collapse = "")) 
# Group.1 x 
#1  X AB 
#2  Y AC 
#3  Z AC 
+1

Вы также можете использовать формулу стиль и использовать 'data' аргумент, чтобы избежать написания' ф.р. $ · ':' совокупный (г ~ г, функция (х) paste0 (сорт (уникальный (х)), коллапс = ""), data = df) ' –

+1

Я действительно предпочитаю« список »для« вставки »в этих случаях, чтобы сохранить гибкость при дальнейшем анализе, если это необходимо. 'aggregate (r ~ g, df, function (x) unique (sort (as.character (x))), simplify = FALSE)'. Но это отвечает на их вопрос как представленный, поэтому +1 :-) – A5C1D2H2I1M1N2O1R2T1

1

Дайте это попробовать:

dg <- data.frame(
    g = levels(df$g), 
    r = tapply(df$r, df$g, function(n) {paste(sort(unique(n)), collapse = " ")}) 
) 
> dg 
    g r 
X X A B 
Y Y A C 
Z Z A C 
Смежные вопросы