Как создать таблицу из data.frame, где ячейка может иметь несколько значений, используя R - PullRequest
0 голосов
/ 28 ноября 2018

Я попытался просмотреть таблицы и просмотреть другие вопросы, задаваемые здесь, но не смог найти ответ.

Я использую R , и Мой data.frame выглядит следующим образом:

data

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

Вот пример того, как я хочу отформатировать таблицу:

Table

IsЕсть ли способ написать код для этого, чтобы избежать использования Excel и Word для создания таблицы?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вот один из способов:

library(tidyr)
library(dplyr)

# example data
exd <- data.frame(
    Vertical   = c(10,10,2.5,5,10,5,2.5,10,1.25,1.25,1.25, 1.25),
    Horizontal = c(2,2,3,2,4,2,3,4,1,4,4,1),
    row.names = LETTERS[1:12])

# move values into a column
exd <- mutate(exd,
              Value = rownames(exd))
# aggregate by Vertical and Horizontal
exd <- summarize(group_by(exd, Vertical, Horizontal),
                 Value = paste(Value, collapse = ","))
# re-arrange into the desired form
spread(exd, Horizontal, Value)
0 голосов
/ 28 ноября 2018

Попробуйте:

df = data.frame(let = LETTERS[1:12], 
                vert = c(10, 10, 2.5, 5, 10, 5, 2.5, 10, 1.25, 1.25, 1.25, 1.25),
                hor = c(2,2,3,2,4,2,3,4,1,4,4,1), 
                stringsAsFactors = F)


# find unique combinations
positions = expand.grid(unique(df$vert), unique(df$hor))

# pre-allocate matrix
M = matrix(ncol = length(unique(df$hor)),
       nrow = length(unique(df$vert)))

rownames(M) <- sort(unique(df$vert))
colnames(M) <- sort(unique(df$hor))

# loop over valid positions and put them in the matrix
for (i in c(1:nrow(positions))){

  # get row
  row = as.numeric(positions[i,])

  # gather all entries that go in position
  valid = df[df$vert == row[1] & df$hor == row[2], 'let']
  valid = paste(valid, collapse=",")

  # get matrix indices
  vert_i  <- which(rownames(M) == row[1])
  horiz_i <- which(colnames(M) == row[2])

  # put the data in the matrix
  M[vert_i, horiz_i] <- valid
  }

print(M)

Это может быть более эффективным, но оно выполняет свою работу.

...