【问题标题】:Reshape Data frame variables into list将数据框变量重塑为列表
【发布时间】:2015-11-20 14:26:38
【问题描述】:

我对 R 有意见。

我有以下数据框:

FirstName LastName Exercice1 Exercice2
   Eric       A        15        12
   Eric       A        14        14
   Eric       A        12        15
   Paul       B        12        14
   Paul       B        14        14
   Joe        C        15        12
   Joe        C        15        17
   Joe        C        16        17
   Joe        C        18        19

我想把它改成下面这样:

FirstName   LastName            Mark
                         Exercice1 Exercice2
   Eric         A            15        12
                             14        14
                             12        15
                         Exercice1 Exercice2
   Paul        B             12        14
                             14        14
                         Exercice1 Exercice2
   Joe        C              15        12
                             15        17
                             16        17
                             18        19

简而言之,我想为每个学生将他们在每次测试中的分数分组到一个变量中,即一个数据框。

如果可能的话,你有什么想法吗?我应该怎么做?

【问题讨论】:

  • 到现在为止你尝试了什么?将信息放入您的问题中。
  • 你说的是这个层次型表中数据的呈现方式吗?
  • 您可以为此编写一个打印方法,但这不是 R 中的默认行为。这种排列方式对于分析不是很有用,它更适合于演示。
  • 或者你可以使用split,至少可以生成所有单独的数据帧。
  • @Konrad 我可能误解了您的建议,但您所指的内容不会对当前数据框产生太大影响,只是名称不同。

标签: r dataframe reshape reshape2


【解决方案1】:

如果您只需要将 Mark 列作为学生的 data.frame,那么您可以使用它:

dat <- read.table(text = "FirstName LastName Exercice1 Exercice2
   Eric       A        15        12
                  Eric       A        14        14
                  Eric       A        12        15
                  Paul       B        12        14
                  Paul       B        14        14
                  Joe        C        15        12
                  Joe        C        15        17
                  Joe        C        16        17
                  Joe        C        18        19", stringsAsFactors = FALSE, header = TRUE)

dat2 <- dat[!duplicated(dat[,1:2]),1:2]
dat2$Mark <- I(split(dat[,3:4], list(dat$FirstName, dat$LastName), drop = TRUE))

dat2
#  FirstName LastName         Mark
#1      Eric        A c(15, 14....
#4      Paul        B c(12, 14....
#6       Joe        C c(15, 15....

标记是数据框列表:

> dat2$Mark
$Eric.A
  Exercice1 Exercice2
1        15        12
2        14        14
3        12        15

$Paul.B
  Exercice1 Exercice2
4        12        14
5        14        14

$Joe.C
  Exercice1 Exercice2
6        15        12
7        15        17
8        16        17
9        18        19

现在,为了像您展示的那样进行打印,您需要一个自定义打印功能,但无论如何您都不应该需要它。或者只是添加空行以获得所需的打印输出。这既不漂亮也不像你的输出,但它是一个开始:

dat3 <- dat
dat3[duplicated(dat[,1:2]),1:2] <- ""
print(dat3, row.names = FALSE)
# FirstName LastName Exercice1 Exercice2
#      Eric        A        15        12
#                           14        14
#                           12        15
#      Paul        B        12        14
#                           14        14
#       Joe        C        15        12
#                           15        17
#                           16        17
#                           18        19

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2020-06-05
    • 2014-10-10
    • 2017-03-10
    • 1970-01-01
    • 2021-08-14
    • 2016-02-14
    相关资源
    最近更新 更多