gpt4 book ai didi

R 数据框组织

转载 作者:行者123 更新时间:2023-12-03 14:36:26 25 4
gpt4 key购买 nike

我想分析 R 中的一系列赛艇比赛,其中每艘有 4 名赛艇运动员成对比赛。我想知道在数据框中表示它的最佳方式。我目前有 12 个定时事件,其中 2 个这样的事件构成了两艘船之间的比赛。

     time race boat seat1 seat2 seat3 seat4
1 204.98 1 1 2 6 1 5
2 202.49 2 1 4 5 2 7
3 202.27 3 1 2 6 3 7
4 206.48 4 1 1 7 2 8
5 204.85 5 1 4 8 2 6
6 204.93 6 1 2 8 3 5
7 204.91 1 2 3 7 4 8
8 207.40 2 2 1 8 3 6
9 207.62 3 2 1 5 4 8
10 203.41 4 2 3 5 4 6
11 205.04 5 2 3 7 1 5
12 204.96 6 2 4 6 1 7

此处座位栏中的数字指的是划船者(因此有 8 个),但使用名称或字母会更自然。我需要提取一个 12x8 矩阵来捕获哪个赛艇运动员参加了哪个事件。

下面的代码构建了上面的数据框:
df <- data.frame ( 
time = c(204.98, 202.49, 202.27, 206.48, 204.85, 204.93,
204.91, 207.40, 207.62, 203.41, 205.04, 204.96),
race = append(1:6, 1:6),
boat = append(rep(1,6),rep(2,6)),
seat1 = c(2,4,2,1,4,2, 3,1,1,3,3,4),
seat2 = c(6,5,6,7,8,8, 7,8,5,5,7,6),
seat3 = c(1,2,3,2,2,3, 4,3,4,4,1,1),
seat4 = c(5,7,7,8,6,5, 8,6,8,6,5,7))

  • 为了提取赛艇运动员和赛事之间的关系,以不同的方式组织它会更好吗?
  • 在单独的数据框中捕获有关赛艇运动员的其他信息(例如他们的体重、年龄)是否自然,还是将所有内容保存在一个数据框中更好(如何?)。

  • 似乎在冗余和便利之间有一个权衡。而在关系数据库中,人们会使用多个关系,但 R 社区似乎更喜欢在单个数据框中共享数据。我确信总有一种方法可以使它工作,但缺乏经验我很好奇有经验的 R 用户将如何组织数据。

    附录:很多答案都强调了问题的重要性。以下是将数据转化为矩阵形式的好处:赛艇运动员在比赛中花费的总时间:事件时间向量和连接前面提到的事件和赛艇运动员的 {0,1} 值矩阵。可以通过将它们相乘来获得结果。

    最佳答案

    要创建一个事件表与划船者的比较,将数据融合为长格式 m然后变回适当的宽幅形式。没有理由您不能拥有多种形式的数据,因此实际上没有必要选择最佳形式。如果有新数据进来,你总是可以重新生成它们。感兴趣的形式实际上取决于你想用它做什么,但下面的代码为你提供了三种形式:

  • 原宽表df ,
  • 长格式 m这可能对回归、箱线图等有用。例如
    lm(time ~ factor(rower) + 0, m)
    boxplot(time ~ boat, m)
  • 修订后的宽表格 df2 .

  • 如果存在特定于划船器的属性,那么这些属性可以存储在单独的数据框中,每个划船器一行,每个属性一列,并且取决于您想要做什么,可以与 m 合并。使用 merge如果你想在回归中使用它们,比如说。
    library(data.table)

    m <- melt(as.data.table(df), id = 1:3, value.name = "rower")
    df2 <- dcast(data = m, time + race + boat ~ rower, value.var = "rower")
    setkey(df2, boat, race) # sort
    df2

    给予:
          time race boat  1  2  3  4  5  6  7  8
    1: 204.98 1 1 1 2 NA NA 5 6 NA NA
    2: 202.49 2 1 NA 2 NA 4 5 NA 7 NA
    3: 202.27 3 1 NA 2 3 NA NA 6 7 NA
    4: 206.48 4 1 1 2 NA NA NA NA 7 8
    5: 204.85 5 1 NA 2 NA 4 NA 6 NA 8
    6: 204.93 6 1 NA 2 3 NA 5 NA NA 8
    7: 204.91 1 2 NA NA 3 4 NA NA 7 8
    8: 207.40 2 2 1 NA 3 NA NA 6 NA 8
    9: 207.62 3 2 1 NA NA 4 5 NA NA 8
    10: 203.41 4 2 NA NA 3 4 5 6 NA NA
    11: 205.04 5 2 1 NA 3 NA 5 NA 7 NA
    12: 204.96 6 2 1 NA NA 4 NA 6 7 NA

    或者,使用 dplyr/tidyr:
    library(dplyr)
    library(tidyr)

    m <- df %>%
    pivot_longer(-(1:3), names_to = "seat", values_to = "rower")
    df2 <- m %>%
    pivot_wider(1:3, names_from = rower, values_from = rower, names_sort = TRUE)

    关于R 数据框组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61878400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com