2013-11-03 2 views
-1

У меня есть два следующих кадра данных: первая представляющая частота и вторая, представляющая отдельные события. Я пытаюсь добавить столбец ко второму данным, который объединяет данные от первого ко второму, обусловленные строкой/столбцом.Слияние преобразованных кадров данных и репликационных значений на основе категорий

event a b c 
     w 0 1 3 
     x 3 4 0 
     y 6 0 4 
     z 0 0 4 

     event person 
     w  b 
     w  b 
     x  a 
     x  b 
     x  b 
     z  c 
     z  a 
     y  b 
     y  c 
     y  a 
     y  c 

counts <- data.frame (event= c("w", "x", "y", "z"), a= c(0, 3, 6, 0), b=c(1, 4, 0, 0), c=c(3, 0, 4, 4)) 
cases <- data.frame(event=c("w", "w", "x", "x", "x", "z", "z", "y", "y", "y", "y"), 
         person=c("b", "b", "a", "b", "b", "c", "a", "b", "c", "a", "c")) 

Цель:

case person freq 
    w  b  1 
    w  b  1 
    x  a  3 
    x  b  4 
    x  b  4 
    z  c  0 
    z  a  0 
    y  b  0 
    y  c  4 
    y  a  6 
    y  c  4 

без особого успеха. Я смог использовать пакет reshape для генерации первого DF частот, но не могу понять, как их объединить.

+0

Попробованная 'merge' ?. – TheComeOnMan

+1

@Codoremifa: В этом случае я не видел стратегии использования 'merge'. Позаботьтесь о том, что вы думаете? –

+0

Надеюсь, я правильно понял вопрос - 'library (reshape2); countsmeltted <- melt (counts, id.vars = "event"); colnames (countsmelted) <- c («событие», «человек», «частота»); merge (case, countsmelted, all.x = TRUE, by = c ("event", "person")); ' – TheComeOnMan

ответ

1

Функция «[» может принимать матрицу из двух столбцов в качестве аргумента в объект матрицы. Это частичное инверсное значение table. Также есть функция as.data.frame.table.

mcounts <- data.matrix(counts[-1]) 
mcounts[ cbind(cases$event, cases$person)] 
[1] 1 1 3 4 4 4 0 0 4 6 4 
cases$freq <- mcounts[ cbind(cases$event, cases$person)] 
cases 
#------------ 
    event person freq 
1  w  b 1 
2  w  b 1 
3  x  a 3 
4  x  b 4 
5  x  b 4 
6  z  c 4 
7  z  a 0 
8  y  b 0 
9  y  c 4 
10  y  a 6 
11  y  c 4 

Это не точное решение, потому что я не тратить время на Контрактное строки таблицы правильно:

> tcounts <- data.matrix(tcounts) 
> class(tcounts) <- 'table' 
> tcounts 
    a b c 
[1,] 0 1 3 
[2,] 3 4 0 
[3,] 6 0 4 
[4,] 0 0 4 
> as.data.frame(tcounts) 
    Var1 Var2 Freq 
1  A a 0 
2  B a 3 
3  C a 6 
4  D a 0 
5  A b 1 
6  B b 4 
7  C b 0 
8  D b 0 
9  A c 3 
10 B c 0 
11 C c 4 
12 D c 4 
Смежные вопросы