R - сгруппировать данные в кадре данных по двум столбцам и переставить в новый кадр данных - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть датафрейм foo:

   A  B  C
1  x  m  2
2  x  n  3
3  x  o  11
4  y  m  5
5  y  o  8

Редактировать: спасибо @akrun за напоминание, я добавляю код для создания этого df:

foo <- structure(list(A = c("x", "x", "x", "y", "y"), 
       B = c("m", "n", "o", "m", "o"), C = c(2L, 3L, 11L, 5L, 8L)), 
       class = "data.frame", row.names = c("1", "2", "3", "4", "5"))

и из него я хочу создать новый фрейм данных со значениями в A в качестве имен строк, в значениях B в качестве имен столбцов и в качестве записей значений в C, например так:

   m  n  o
x  2  3  11
y  5  NA 8

Пока что я нашел функцию aggregate ()

aggregate(.~A, foo, FUN=toString)

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

   A  B      C
1  x  1,2,3  2,3,11
2  y  1,3    5,8

I нашел ответы на SO, предлагая пакет dplyr и group_by для подобных проблем, но я не мог обдумать, как приспособить это к моей проблеме. Извините, если я что-то упустил, спасибо за любые предложения!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Мы можем использовать xtabs из base R

xtabs(C ~ A + B, df1)

данные

df1 <- structure(list(A = c("x", "x", "x", "y", "y"), B = c("m", "n", 
"o", "m", "o"), C = c(2L, 3L, 11L, 5L, 8L)), class = "data.frame", 
row.names = c("1", 
"2", "3", "4", "5"))
2 голосов
/ 02 апреля 2020

Если вы хотите использовать решение tidyverse, вы можете использовать pivot_wider из tidyr.

Редактировать : добавлено column_to_rownames для перемещения столбца А в строку имена.

library(tidyverse)

foo %>%
  pivot_wider(id_cols = A, names_from = B, values_from = C) %>%
  column_to_rownames("A")

Выход

  m  n  o
x 2  3 11
y 5 NA  8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...