【问题标题】:R : rename columns in function of data of a second dataframe (unblinding data)R:在第二个数据帧的数据函数中重命名列(揭盲数据)
【发布时间】:2020-01-28 09:50:23
【问题描述】:

背景: 我做了一个双盲心理学实验(这意味着参与者和实验都是新的)。有两个会话:session1 和 session2,以及两个条件 SHAM 和真正的 tDCS。

主要数据集:数据结构如下:

df<- structure(list(ID = 1:4, session1_Con_rt_mean = c(537.34, 541.9, 548.76, 
621.35), session1_Incon_rt_mean = c(646.83, 689.4, 614.57,  640.6), 
session2_Con_rt_mean = c(565.42, 547.23, 536.4, 564.15), 
session2_Incon_rt_mean = c(647.53, 660.68, 641.9, 606.52)), 
row.names = c(NA, 4L), class = "data.frame")

>df
  ID session1_Con_rt_mean session1_Incon_rt_mean session2_Con_rt_mean session2_Incon_rt_mean
1  1               537.34                 646.83               565.42                 647.53
2  2               541.90                 689.40               547.23                 660.68
3  3               548.76                 614.57               536.40                 641.90
4  4               621.35                 640.60               564.15                 606.52

我有一组以“session1”或“session2”开头的变量。

第二个数据集:在另一个 csv 文件中,我有一个数据库,可以告诉我参与者是处于 SHAM 状态还是 REAL 状态。

df2 <- structure(list(ID = 1:4, session1 = c("SHAM","REAL","SHAM","SHAM"), 
session2 = c("REAL","SHAM","REAL","REAL")), row.names = c(NA, 
4L), class = "data.frame")

>df2
  ID session1 session2
1  1     SHAM     REAL
2  2     REAL     SHAM
3  3     SHAM     REAL
4  4     SHAM     REAL

我想要实现的目标:我想重命名列(或创建新列?)并正确调整数据。所以基本上我认为它将包括重新混合数据,从 session1/session2 结构到 REAL/SHAM 结构。 示例:如果参与者 1 在 session1 中为 REAL,则 session1 列的所有数据都进入 rename REAL_nameofvariable 列。

我想要达到的结果示例:

  ID SHAM_Con_rt_mean SHAM_Incon_rt_mean REAL_Con_rt_mean REAL_Incon_rt_mean
1  1           537.34             646.83           565.42             647.53
2  2           547.23             660.68           541.90             689.40

问题:我怎样才能有效地编写代码?

PS:如果我不清楚,请提出任何问题。

【问题讨论】:

  • @sindri_baldur 感谢您的评论。它实际上是一个 .csv 文件,我在 R 中进行数据分析。我会改写我的帖子。

标签: r


【解决方案1】:

也许你可以整理一下数据,然后将你的两个数据表加入到揭盲对象中。

要整理数据,请考虑将变量从宽转换为长。

然后,您可以根据 ID 号和session 连接这两个表。

library(tidyverse)

tidy_main_data <- main_data %>%
  pivot_longer(cols = -ID, names_to = c("session", ".value"), names_pattern = "(\\d)_(\\w+)")

tidy_blinding_table <- blinding_table %>%
  pivot_longer(cols = -ID, names_to = "session", names_pattern = "(\\d)")

left_join(tidy_main_data, tidy_blinding_table, by = c("ID", "session"))

输出

# A tibble: 10 x 5
      ID session Con_rt_mean Incon_rt_mean value
   <int> <chr>         <int>         <int> <fct>
 1     1 1               491           439 SHAM 
 2     1 2               723           455 REAL 
 3     2 1               649           584 REAL 
 4     2 2               344           330 SHAM 
 5     3 1               330           438 REAL 
 6     3 2               271           930 SHAM 
 7     4 1               368           423 SHAM 
 8     4 2               143           536 REAL 
 9     5 1               460           511 REAL 
10     5 2               938           525 SHAM 

编辑:如果你愿意,可以pivot_wider

joined_tables <- left_join(tidy_main_data, tidy_blinding_table, by = c("ID", "session"))

joined_tables %>%
  pivot_wider(id_cols = ID, names_from = "value", values_from = c("Con_rt_mean", "Incon_rt_mean"))

# A tibble: 5 x 5
     ID Con_rt_mean_SHAM Con_rt_mean_REAL Incon_rt_mean_SHAM Incon_rt_mean_REAL
  <int>            <int>            <int>              <int>              <int>
1     1              491              723                439                455
2     2              344              649                330                584
3     3              271              330                930                438
4     4              368              143                423                536
5     5              938              460                525                511

数据

set.seed(10)

main_data <- data.frame(
  ID = 1:5,
  session1_Con_rt_mean = sample(1:1000, 5, replace = T),
  session1_Incon_rt_mean = sample(1:1000, 5, replace = T),
  session2_Con_rt_mean = sample(1:1000, 5, replace = T),
  session2_Incon_rt_mean = sample(1:1000, 5, replace = T)
)

blinding_table <- data.frame(
  ID = 1:5,
  session1 = c("SHAM", "REAL", "REAL", "SHAM", "REAL"),
  session2 = c("REAL", "SHAM", "SHAM", "REAL", "SHAM")
)

【讨论】:

  • 非常感谢!它完美地工作。编辑:我看到你同时在你的答案中添加了 pivot_wider,谢谢。
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2020-10-09
  • 1970-01-01
  • 2022-09-22
  • 2018-11-12
  • 2020-05-26
相关资源
最近更新 更多