【问题标题】:Reshape to wide function in R but keep some row combinations在 R 中重塑为宽函数,但保留一些行组合
【发布时间】:2021-08-04 22:34:55
【问题描述】:

我正在尝试将我的数据重塑为更广泛的数据,尝试将数据框准备好进行主题内分析。它目前适用于主体间分析。 到目前为止我找到的最有用的答案是:Using the reshape function in R with multiple matching rows

我的数据如下所示:

SubjID  ITEM SubjGroup Strength Timing Accuracy  RT
1       dance     1      1       200       1    1234
1       dance     1      2       200       0     430  
1       dance     1      1       400       1     450 
1       dance     1      2       400       1     200 
2       dance     2      1       200       0     300
2       dance     2      2       200       0     755
2       dance     2      1       400       1     550 
2       dance     2      2       400       1     520

我需要的是基本上删除强度列并用一个额外的 RT 列替换它,以便 RT1 指的是我在 Strength1 下得到的值,RT2 是指我在 Strength2 下得到的值,并且为了准确性做同样的事情。对于每个主题,每个项目重复 4 次(在强度 + 时间的两种不同组合下),这意味着到重塑结束时,每个动词和每个主题将有 2 行,而不是每个项目和每个主题 4 行。像这样:

SubjID  ITEM SubjGroup        Timing           RT1   RT2
1       dance     1             200           1234   430
1       dance     1             400            450   200 
2       dance     2             200            300   755
2       dance     2             400            550   520 

同时删除准确性列(如果它使事情变得更容易)或添加第二个。

我尝试了一个简单的重塑公式(与上面链接中 OP 发布的公式相同),它以某种方式在具有相同表标题但只有一个主题 ID 的类似数据框上工作:reshape(datafr, idvar = c("ï..Subject", "Timing", "Group", "ITEM"), timevar= "TMS", direction = "wide") 当我尝试它上面的数据确实创建了正确的列,但它是空的,我收到了警告消息。我也尝试过使用 Pivot,但它不起作用。
谢谢!

【问题讨论】:

  • 您能否 (a) 编辑您的示例输入以便在 R 中轻松导入? dput() 是最简单的,如果您有样本数据 dput(your_data[1:8, ]) 将制作前 8 行的复制/粘贴版本。最好知道您显示的空白是空字符串、NA 值还是其他内容。
  • (b) 您能否明确显示您正在寻找的样本输入的输出?我不知道您所说的Strength1Strength2 是什么意思,并且“准确度将指两者之一” 令人困惑——哪一个,我们怎么知道哪一个?您可能需要编辑示例输入以使其充分说明问题。
  • 另外 “每个动词和每个主语将有 2 行,而不是每个项目 4 行” - 我看到了 SubjID,所以我可以猜出主语是什么. “动词”是什么意思?
  • @GregorThomas 完成,谢谢!
  • @GregorThomas 我注意到我必须复制 Accuracy 列或添加第二个列,但如果它使事情变得更容易,我可以去掉它。

标签: r dataframe pivot reshape dcast


【解决方案1】:

重塑2

out <- reshape2::dcast(dat, SubjID + ITEM + SubjGroup + Timing ~ Strength, value.var = "RT")
names(out)
# [1] "SubjID"    "ITEM"      "SubjGroup" "Timing"    "1"         "2"        
names(out)[5:6] <- paste0("RT", names(out)[5:6])
out
#   SubjID  ITEM SubjGroup Timing  RT1 RT2
# 1      1 dance         1    200 1234 430
# 2      1 dance         1    400  450 200
# 3      2 dance         2    200  300 755
# 4      2 dance         2    400  550 520

整理

tidyr::pivot_wider(dat, c(SubjID, ITEM, SubjGroup, Timing),
                   names_prefix = "RT", names_from = "Strength", values_from = "RT")
# # A tibble: 4 x 6
#   SubjID ITEM  SubjGroup Timing   RT1   RT2
#    <int> <chr>     <int>  <int> <int> <int>
# 1      1 dance         1    200  1234   430
# 2      1 dance         1    400   450   200
# 3      2 dance         2    200   300   755
# 4      2 dance         2    400   550   520

甚至

tidyr::pivot_wider(dat, c(SubjID, ITEM, SubjGroup, Timing),
                   names_from = "Strength", values_from = c("Accuracy", "RT"),
                   names_sep = "")
# # A tibble: 4 x 8
#   SubjID ITEM  SubjGroup Timing Accuracy1 Accuracy2   RT1   RT2
#    <int> <chr>     <int>  <int>     <int>     <int> <int> <int>
# 1      1 dance         1    200         1         0  1234   430
# 2      1 dance         1    400         1         1   450   200
# 3      2 dance         2    200         0         0   300   755
# 4      2 dance         2    400         1         1   550   520

【讨论】:

  • 感谢这很有帮助。但是,第一个选项导致一些缺失的行(每个项目总共 3 个而不是 4 个,因此某些参与者缺少一行),并且只有具有准确度值的列,第二个和第三个创建了第二个 RT 列但它已满为 NULL。
  • Gregor 提供dput(your_data[1:8, ]) 输出的第一个建议仍然是样本数据的黄金标准。请调整行子集 (1:8),以便您提供给我们的样本重现您在评论中描述的症状。
  • MaryBay,你能解决这个问题吗?如果没有,您仍然需要添加明确的数据 (dput)。如果是这样,并且我的回答很有帮助,请考虑accepting。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2021-08-27
相关资源
最近更新 更多