Создать фрейм данных с повторяющимися значениями - PullRequest
0 голосов
/ 11 июня 2019

Я хотел бы создать тиббл, который выглядит следующим образом:

# A tibble: 3 x 4
  team    arsenal      chelsea spurs       
  <chr>   <chr>        <chr>   <chr>       
1 arsenal self         london  north-london
2 chelsea london       self    london      
3 spurs   north-london london  self  

Как видите, информация в тиббле дублируется.Читая в первом ряду (команда = арсенал), мы видим, что между «арсеналом» и «шпорами» существует дерби в «северном Лондоне».Точно так же, читая в третьем ряду (команда = шпоры), существует дерби «север-Лондон» между «шпорами» и «арсеналом».

Давайте назовем этот столбик df_derbies.Я создал его со следующим кодом:

library(tidyverse)

## create vectors
team <- c("arsenal", "chelsea", "spurs")
arsenal <- c("self", "london", "north-london")
chelsea <- c("london", "self", "london")
spurs <- c("north-london", "london", "self")

## combine vectors into dataframe
df_derbies <- tibble(team, arsenal, chelsea, spurs)
df_derbies

У меня вопрос двоякий:

1) Есть ли способ создать начальные векторы, чтобы мне не приходилось вводитьout дубликаты информации? Это будет означать, что мне нужно будет, например, набрать 'north-london' только один раз.

2) После первого шага есть ли функция, которая можетсоздать тиббл, как указано выше? Это будет по существу дублировать информацию для соответствующей комбинации строки и столбца.

Причина этого заключается в том, что я хотел бы создать более крупный тиббл, до 20строк.Я открыт для предложений по лучшему способу создания и объединения векторов!

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Чтобы не вводить дублирующую информацию, вам необходимо сначала поработать с матрицей, а затем преобразовать матрицу в таблицу. Вот один из способов сделать это:

library(tibble)

teams <- c("arsenal", "chelsea", "spurs")
derbies <- c("london", "north-london", "london")
mx <- matrix("self", length(teams), length(teams))
mx[lower.tri(mx)] <- mx[upper.tri(mx)] <- derbies
df_derbies <- as_tibble(cbind(teams, mx), .name_repair = function(x) c("teams", teams))
1 голос
/ 11 июня 2019

Вы можете использовать матрицу и использовать upper.tri и lower.tri функцию базового R, например:

## create vectors
team <- c("arsenal", "chelsea", "spurs")
arsenal <- c("self", "london", "north-london")
chelsea <- c("", "self", "london")
spurs <- c("", "", "self")

## combine vectors into dataframe
df_derbies <- rbind(arsenal, chelsea, spurs)
rownames(df_derbies) <- c("arsenal", "chelsea", "spurs")
colnames(df_derbies) <- c("arsenal", "chelsea", "spurs")
df_derbies[lower.tri(df_derbies)] <- df_derbies[upper.tri(df_derbies)]
...