【问题标题】:Rearrange Dataframe in R - Merging Unique Repeated Values into Rows在 R 中重新排列数据框 - 将唯一的重复值合并到行中
【发布时间】:2021-11-10 16:06:22
【问题描述】:

第一次问问题,如果我的格式关闭了,请见谅。

我在网上搜索了 3 天以找到此问题的答案,但一直找不到任何东西。我有一个包含 3 列的数据框:重复随机生成的参与者 ID(例如 W21334D0、B8123K)、问题编号(分类 - 例如 q1、q2、q3)和问题响应(数字和分类 - 例如, "1", "1,2", "15,20,15")。

例如,我将始终给出的数据框是以下形式:

Participant question_id question_answer
W21334D0 q1 1
W21334D0 q2 1,2
W21334D0 q3 0
W21334D0 q4 1
B8123K q3 1
B8123K q2 2,1
B8123K q4 0
P0213MEW q1 1
P0213MEW q3 0
P0213MEW q4 1
P0213MEW q2 1,2

我希望重新排列数据框或创建一个新的数据框,以便每个唯一的参与者 ID 是一行,其中每个唯一的 question_id 是一列,按 q1-q96 的顺序排列。

例如:

Participant q1 q2 q3 q4
W21334D0 1 1,2 0 1
B8123K NA 2,1 1 0
P0213MEW 1 1,2 0 1

在过去的几天里,我尝试了各种方法,最接近的方法是为每个唯一参与者创建单独的数据框,其中包括参与者 question_ids 和 question_answers 的行(但不是按顺序)。

为此,我做了:

for(i in unique(dat$participant)) {
  nam <- paste(i)
  assign(nam, t(dat[dat$participant==i,-1]))
}

但是使用这段代码,我不知道如何将数据帧组合成一个数据帧,也不知道如何将行全部按“q1、q2、q3、q4...”的顺序排列

任何帮助将不胜感激!

【问题讨论】:

  • 您好,您可以使用 dput(dt) 分享您的示例数据集吗? (如果 dt 是您的数据框的名称)谢谢!
  • 感谢罗莎莉的帮助! r2evans 和您的回复都有效!!几天来,我一直在绞尽脑汁寻找答案,我很惊讶每个人都能如此迅速地提供帮助 - 非常感谢!

标签: r dataframe vector merge


【解决方案1】:

重塑2

reshape2::dcast(dat, Participant ~ question_id, value.var = "question_answer")
#   Participant   q1  q2 q3 q4
# 1      B8123K <NA> 2,1  1  0
# 2    P0213MEW    1 1,2  0  1
# 3    W21334D0    1 1,2  0  1

(这也适用于data.table 包,如果dat 继承data.table。)

dplyr

tidyr::pivot_wider(dat, Participant, names_from = "question_id", values_from = "question_answer")
# # A tibble: 3 x 5
#   Participant q1    q2    q3    q4   
#   <chr>       <chr> <chr> <chr> <chr>
# 1 W21334D0    1     1,2   0     1    
# 2 B8123K      <NA>  2,1   1     0    
# 3 P0213MEW    1     1,2   0     1    

数据

dat <- structure(list(Participant = c("W21334D0", "W21334D0", "W21334D0", "W21334D0", "B8123K", "B8123K", "B8123K", "P0213MEW", "P0213MEW", "P0213MEW", "P0213MEW"), question_id = c("q1", "q2", "q3", "q4", "q3", "q2", "q4", "q1", "q3", "q4", "q2"), question_answer = c("1", "1,2", "0", "1", "1", "2,1", "0", "1", "0", "1", "1,2")), class = "data.frame", row.names = c(NA, -11L))

【讨论】:

    【解决方案2】:

    您可以使用包tidyr 中的pivot_wider() 来实现该目标。 下面是一个示例数据:

    dt <- data.frame("Participant" = sample(c("W21334D0", "B8123K", "P0213MEW"), 12, replace = T),
                     "question_id" = sample(paste0("q", 1:4), 12, replace = T),
                     "question_answer" = sample(rnorm(100, 1, 1), 12, replace = T))
    
    library(tidyr)
    
    dt %>% 
      pivot_wider(id_cols = "Participant", 
                  names_from = "question_id", 
                  values_from = "question_answer", 
                  values_fn = mean)
    

    【讨论】:

    • 您的question_answernumeric,但在OP 中我认为它是character,所以values_fn=mean 似乎不正确。
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2020-10-19
    • 2013-10-21
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多