创建具有重复值的数据框

时间:2019-06-11 15:51:39

标签: r data-manipulation tibble

我想创建一个如下所示的小标题:

# 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  

如您所见,小标题中的信息是重复的。沿第一行阅读(团队=阿森纳),我们可以看到“阿森纳”和“马刺”之间有一个“北伦敦”德比。同样,沿着第三行(team = spurs)阅读,在“ spurs”和“ arsenal”之间有一个“ north-london” derby。

我们将此称呼为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)是否有一种方法可以创建初始向量,从而使我不必键入重复的信息?这将意味着我只需要键入一次“ north-london”即可。

2)第一步之后,有没有一个函数可以创建上述的小标题?这实际上将复制行和列的相关组合的信息。

这样做的原因是我想创建一个更大的小标题,最多20行。我愿意提出更好的方法来创建和组合向量的建议!

2 个答案:

答案 0 :(得分:1)

您可以使用矩阵并使用基本R的upper.trilower.tri函数,如下所示:

## 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)]

答案 1 :(得分:1)

为避免键入重复信息,您将需要首先使用矩阵,然后将矩阵转换为小标题。这是一种方法:

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))