【问题标题】:Tidying data using R使用 R 整理数据
【发布时间】:2020-02-13 13:38:34
【问题描述】:

我在整理大型数据集时遇到问题,非常感谢您的帮助。我的数据子集如下所示:

> d1
# A tibble: 16 x 8
   Subject   RT1   RT2 item                 ROI `Item _Number` IA_LABEL  block
     <dbl> <dbl> <dbl> <chr>              <dbl>          <dbl> <chr>     <dbl>
 1       1   567   261 brilliant salesman     1              1 brilliant     3
 2       1   494    76 brilliant salesman     2              1 salesman      3
 3       1   441   211 detailed brochure      1              2 detailed      3
 4       1   544   282 detailed brochure      2              2 brochure      3
 5       1   289   153 detailed brochure      1              2 detailed      4
 6       1   141   141 detailed brochure      2              2 brochure      4
 7       1   141   141 brilliant salesman     1              1 brilliant     4
 8       1   263    90 brilliant salesman     2              1 salesman      4
 9       2   216   216 detailed brochure      1              2 detailed      3
10       2   248   248 detailed brochure      2              2 brochure      3
11       2   216   128 brilliant salesman     1              1 brilliant     3
12       2   238   140 brilliant salesman     2              1 salesman      3
13       2   212   212 detailed brochure      1              2 detailed      6
14       2   369   241 detailed brochure      2              2 brochure      6
15       2   208   208 brilliant salesman     1              1 brilliant     6
16       2   191   191 brilliant salesman     2              1 salesman      6
dput (d1)
structure(list(Subject = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 
2, 2, 2, 2), RT1 = c(567, 494, 441, 544, 289, 141, 141, 263, 
216, 248, 216, 238, 212, 369, 208, 191), RT2 = c(261, 76, 211, 
282, 153, 141, 141, 90, 216, 248, 128, 140, 212, 241, 208, 191
), item = c("brilliant salesman", "brilliant salesman", "detailed brochure", 
"detailed brochure", "detailed brochure", "detailed brochure", 
"brilliant salesman", "brilliant salesman", "detailed brochure", 
"detailed brochure", "brilliant salesman", "brilliant salesman", 
"detailed brochure", "detailed brochure", "brilliant salesman", 
"brilliant salesman"), ROI = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 
1, 2, 1, 2, 1, 2), `Item _Number` = c(1, 1, 2, 2, 2, 2, 1, 1, 
2, 2, 1, 1, 2, 2, 1, 1), IA_LABEL = c("brilliant", "salesman", 
"detailed", "brochure", "detailed", "brochure", "brilliant", 
"salesman", "detailed", "brochure", "brilliant", "salesman", 
"detailed", "brochure", "brilliant", "salesman"), block = c(3, 
3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 6, 6, 6, 6)), row.names = c(NA, 
-16L), class = c("tbl_df", "tbl", "data.frame"))

此数据表示读取某些单词(IA_Label)后的反应时间(RT1 和 RT2)。在列 (IA_LABEL) 的每一行中,只有一个单词的反应时间(RT1 和 RT2)。因此,IA_LABEL 中的这些词表示短语的第一个词(ROI=1)和同一短语的第二个词(ROI=2)。我编写这个实验的方式让我只能分别查看每个单词。我还尝试查看整个短语的 RT1 和 RT2(整个短语的 RT1 是 RT1,其中 ROI 为 1 + RT1,其中 ROI 为 2。通过将其值相加,可以将相同的过程应用于 RT2,其中 ROI =1 + 其中 ROI=2。
我试图通过对因变量(RT1 和 RT2)的值求和来创建两列(变量)。

所以,理想情况下,我希望有一个代码能够以类似于下面的方式改变两个变量,其中第一行 Sum_RT1 = RT1 该行(其中ROI=1) + RT2ROI=2 的后续行。 Sum_RT1 的第二行将是相同的值,因为将应用相同的求和过程,但方向相反(即,RT1,其中ROI 为 2 + RT1,其中ROI 为 2。

> d2
# A tibble: 16 x 10
   Subject   RT1   RT2 item     ROI `Item _Number` IA_LABEL block Sum_RT1 Sum_RT2
     <dbl> <dbl> <dbl> <chr>  <dbl>          <dbl> <chr>    <dbl>   <dbl>   <dbl>
 1       1   567   261 brill~     1              1 brillia~     3    1061     337
 2       1   494    76 brill~     2              1 salesman     3    1061     337
 3       1   441   211 detai~     1              2 detailed     3     985     493
 4       1   544   282 detai~     2              2 brochure     3     985     493
 5       1   289   153 detai~     1              2 detailed     4     430     294
 6       1   141   141 detai~     2              2 brochure     4     430     294
 7       1   141   141 brill~     1              1 brillia~     4     404     231
 8       1   263    90 brill~     2              1 salesman     4     404     231
 9       2   216   216 detai~     1              2 detailed     3     464     464
10       2   248   248 detai~     2              2 brochure     3     464     464
11       2   216   128 brill~     1              1 brillia~     3     454     268
12       2   238   140 brill~     2              1 salesman     3     454     268
13       2   212   212 detai~     1              2 detailed     6     581     453
14       2   369   241 detai~     2              2 brochure     6     581     453
15       2   208   208 brill~     1              1 brillia~     6     399     399
16       2   191   191 brill~     2              1 salesman     6     399     399

我计划在更大的数据中对许多变量应用该过程,因此非常感谢您的想法和帮助。

【问题讨论】:

  • ROI 是否总是只有 1 或 2,还是需要为更多行扩展?
  • 感谢您的评论@camille。是的,我会尽量确保所有行的 ROI 保持一致(其中 1 代表第一个单词,2 代表第二个单词)
  • 我认为这实际上比看起来要简单得多。按组成您的组的任何列(主题、项目)进行分组,然后将您需要的变量与mutate_at 之类的值相加。要按比例放大,如果要对所有以“RT”开头的列求和,可以是mutate_at(vars(starts_with("RT")))
  • 非常感谢您的建议和评论@camille。

标签: r tidyr dplyr


【解决方案1】:

按主题、项目编号和块对数据进行分组会得到所需的输出吗?

colnames(d1)[6] <- "Item_Number" # delete the blank in the column name (otherwise it gives me an error...)

d2 <- d1 %>%
  group_by(Subject,block, Item_Number) %>%
  mutate(SumRT1 = sum(RT1), 
         SumRT2 = sum(RT2))

输出:

# A tibble: 16 x 10
# Groups:   Subject, block, Item_Number [8]
   Subject   RT1   RT2 item                 ROI Item_Number IA_LABEL  block SumRT1 SumRT2
     <dbl> <dbl> <dbl> <chr>              <dbl>       <dbl> <chr>     <dbl>  <dbl>  <dbl>
 1       1   567   261 brilliant salesman     1           1 brilliant     3   1061    337
 2       1   494    76 brilliant salesman     2           1 salesman      3   1061    337
 3       1   441   211 detailed brochure      1           2 detailed      3    985    493
 4       1   544   282 detailed brochure      2           2 brochure      3    985    493
 5       1   289   153 detailed brochure      1           2 detailed      4    430    294
 6       1   141   141 detailed brochure      2           2 brochure      4    430    294
 7       1   141   141 brilliant salesman     1           1 brilliant     4    404    231
 8       1   263    90 brilliant salesman     2           1 salesman      4    404    231
 9       2   216   216 detailed brochure      1           2 detailed      3    464    464
10       2   248   248 detailed brochure      2           2 brochure      3    464    464
11       2   216   128 brilliant salesman     1           1 brilliant     3    454    268
12       2   238   140 brilliant salesman     2           1 salesman      3    454    268
13       2   212   212 detailed brochure      1           2 detailed      6    581    453
14       2   369   241 detailed brochure      2           2 brochure      6    581    453
15       2   208   208 brilliant salesman     1           1 brilliant     6    399    399
16       2   191   191 brilliant salesman     2           1 salesman      6    399    399

【讨论】:

  • 太棒了!非常感谢@Em Laskey 对您生成的如此快速高效的代码的帮助。所以,如果我错了,请纠正我,我需要应用 group_by 函数来包含任何会为每个 item_number 产生不同 RT 值的变量,对吧。
  • 是的,这正是我认为可以在这里工作的!
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2020-06-11
  • 2023-03-06
相关资源
最近更新 更多