【问题标题】:dcast changes content of dataframedcast 更改数据框的内容
【发布时间】:2023-12-24 12:13:01
【问题描述】:

我尝试使用 reshape 包来重塑我得到的数据框,但是在使用它时,数据框中的数字会改变,这不应该。

数据框包含多个变量以及这些变量被测量的多次,每个人有 6 行,即该人被测量的 6 次。现在我想重塑数据框,因此每个人只有一行而不是 6 行,这意味着每个变量应该存在 6 次(每次测量一次),这应该很容易使用以下代码完成:

melteddata <- melt(daten, id=(c("IDParticipant", "looporder")))

datenrestrukturiert <- dcast(melteddata, IDParticipant~looporder+variable)

“daten”是原始数据框,“looporder”是反映测量时间(1-6)的变量,这里是一个例子(不幸的是我不知道如何发布表格):

https://www.dropbox.com/s/8c9dm4rttedbzw1/daten.jpg?dl=0

或者这很好:

structure(list(IDParticipant = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L), looporder = c(1L, 2L, 3L, 5L, 6L, 2L, 3L, 
5L, 6L, 1L, 2L, 3L), pc_mean_1 = c(NA, 3.22222222222222, NA, 
3.22222222222222, 3.22222222222222, 3.66666666666667, 3.66666666666667, 
3.66666666666667, 3.66666666666667, 3.25, NA, 3.25), bd_mean_1 = c(NA, 
2.88888888888889, NA, 2.88888888888889, 2.88888888888889, 2.75, 
2.75, 2.75, 2.75, 4.08333333333333, NA, 4.08333333333333), sm = c(999, 
4, 999, 3.66666666666667, 1, 4, 4, 5, 5, 5, 999, 5), cm = c(999, 
1.33333333333333, 999, 2.33333333333333, 1, 2, 2, 2.33333333333333, 
1, 3, 999, 1.66666666666667)), .Names = c("IDParticipant", "looporder", 
"pc_mean_1", "bd_mean_1", "sm", "cm"), row.names = c(NA, 12L), class = "data.frame")

datenrestrukturiert 如下所示:

https://www.dropbox.com/s/al93lnj76y1j266/datenrestrukturiert.jpg?dl=0

我不想聚合或任何东西,这就是为什么我尝试添加fun.aggregate = NULL而不做任何更改,而且总是有以下消息:

“缺少聚合函数:默认为长度”

到目前为止一切正常,但有一个问题:当使用 dcast(以及 cast)时,变量中的一些数字会发生变化,主要是“0”或“1”,但通常应该有一些其他数字,如“ 3.44" 或 "4.77" 或类似的东西,但在计算演员表时它们大部分更改为 "0"

有人知道为什么会这样吗?

更多信息可能会有所帮助:当我通过 read.csv2 导入数据集时,第一个变量的名称总是很奇怪,即变量名前面的符号比 Excel 中显示的要多:“ï..IDParticipant ”,我将其重命名为“IDParticipant”,这与它有什么关系吗?

另一个问题:用我提供的 sampleframe 运行它,一切都很好,原始数据帧由 1404 行和 353 个变量组成,对 R 来说会不会太大?

【问题讨论】:

  • 每个变量组合是否有多个值?你能分享一些示例输入和输出吗?
  • 嗨,欢迎来到 SO。我们无法根据推测回答您的问题;我们需要知道您的数据是什么样的。请提供reproducible example
  • any(duplicated(daten[c("IDParticipant", "looporder")])) 的结果是什么?
  • 我得到的结果是TRUE
  • @psytar,那么您必须先添加一个辅助 ID,然后才能继续。

标签: r casting reshape reshape2


【解决方案1】:

这是我基于 Anandas 建议的解决方案(非常感谢)

dataframe 是“daten”,包含许多变量,例如“IDParticipant”、“looporder”和“sm”

首先我们需要创建一个包含变量的对象,以供以后使用 melt- 和 cast-function

idvars

事实证明,数据帧中有重复项,在两个变量“IDParticipant”和“looporder”中具有相同的值,因此我们需要在融合数据帧时向数据帧添加另一个 id-variable,即使用 splitstackshape-package 中的“getanID”完成

melteddata

添加一个额外的 id 变量后,我们终于可以使用额外的 id 变量和其他变量来转换我们需要的数据帧

datenrestrukturiert

【讨论】:

    【解决方案2】:

    如果您有重复的 LHS 和 RHS 变量组合,那么您需要 (1) 创建二级 ID,或 (2) 执行某种形式的聚合。

    您可以使用any(duplicated(...)) 测试是否有重复。

    这是一个示例,使用您现有的“daten”样本(包含重复项):

    library(reshape2)
    
    idvars <- c("IDParticipant", "looporder")
    any(duplicated(daten[idvars]))
    # [1] FALSE
    
    melteddata <- melt(daten, id=idvars)
    datenrestrukturiert <- dcast(melteddata, IDParticipant ~ looporder + variable)
    datenrestrukturiert
    #   IDParticipant 1_pc_mean_1 1_bd_mean_1 1_sm 1_cm 2_pc_mean_1 2_bd_mean_1 2_sm       2_cm 3_pc_mean_1
    # 1             1          NA          NA  999  999    3.222222    2.888889    4   1.333333          NA
    # 2             2          NA          NA   NA   NA    3.666667    2.750000    4   2.000000    3.666667
    # 3             3        3.25    4.083333    5    3          NA          NA  999 999.000000    3.250000
    #   3_bd_mean_1 3_sm       3_cm 5_pc_mean_1 5_bd_mean_1     5_sm     5_cm 6_pc_mean_1 6_bd_mean_1 6_sm
    # 1          NA  999 999.000000    3.222222    2.888889 3.666667 2.333333    3.222222    2.888889    1
    # 2    2.750000    4   2.000000    3.666667    2.750000 5.000000 2.333333    3.666667    2.750000    5
    # 3    4.083333    5   1.666667          NA          NA       NA       NA          NA          NA   NA
    #   6_cm
    # 1    1
    # 2    1
    # 3   NA
    

    但是,由于any(duplicated(...)) 给你TRUE,你可能有更类似于:

    daten2 <- rbind(daten, daten[c(1, 4, 6), ])
    any(duplicated(daten2[idvars]))
    # [1] TRUE
    

    在这种情况下,您可以考虑使用我的“splitstackshape”包中的getanID 方便地将辅助“id”添加到您的数据集。

    library(splitstackshape)
    
    melteddata2 <- melt(getanID(daten2, idvars), c(".id", idvars))
    
    datenrestrukturiert2 <- dcast.data.table(
      melteddata2, .id + IDParticipant ~ looporder + variable)
    
    datenrestrukturiert2
    #    .id IDParticipant 1_pc_mean_1 1_bd_mean_1 1_sm 1_cm 2_pc_mean_1 2_bd_mean_1 2_sm
    # 1:   1             1          NA          NA  999  999    3.222222    2.888889    4
    # 2:   1             2          NA          NA   NA   NA    3.666667    2.750000    4
    # 3:   1             3        3.25    4.083333    5    3          NA          NA  999
    # 4:   2             1          NA          NA  999  999          NA          NA   NA
    # 5:   2             2          NA          NA   NA   NA    3.666667    2.750000    4
    #          2_cm 3_pc_mean_1 3_bd_mean_1 3_sm       3_cm 5_pc_mean_1 5_bd_mean_1     5_sm
    # 1:   1.333333          NA          NA  999 999.000000    3.222222    2.888889 3.666667
    # 2:   2.000000    3.666667    2.750000    4   2.000000    3.666667    2.750000 5.000000
    # 3: 999.000000    3.250000    4.083333    5   1.666667          NA          NA       NA
    # 4:         NA          NA          NA   NA         NA    3.222222    2.888889 3.666667
    # 5:   2.000000          NA          NA   NA         NA          NA          NA       NA
    #        5_cm 6_pc_mean_1 6_bd_mean_1 6_sm 6_cm
    # 1: 2.333333    3.222222    2.888889    1    1
    # 2: 2.333333    3.666667    2.750000    5    1
    # 3:       NA          NA          NA   NA   NA
    # 4: 2.333333          NA          NA   NA   NA
    # 5:       NA          NA          NA   NA   NA
    

    【讨论】:

    • 非常感谢您的回答,不幸的是我没有完全理解您的意思,不应该有任何重复,但是正如您所说,测试这个的功能说有,您是什么LHS 和 RHS 变量是什么意思?我对那里的缩写不熟悉,非常感谢您的帮助!
    • @psytar,左侧和右侧,参考公式。
    • 编辑:它现在以某种方式工作,我会弄清楚如何和回复