【问题标题】:convert individual response data-frame into team-level data-frame in r将个人响应数据框转换为 r 中的团队级数据框
【发布时间】:2015-07-30 16:36:23
【问题描述】:

我有以下数据框:

> team_1_A
  MemberA Q1 Q2
1      C  2  3
2      B  3  4
> team_1_B
  MemberB Q1 Q2
1      A  5  4
2      C  5  2
> team_1_C
  MemberC Q1 Q2
1      A  2  5
2      B  5  5

这些数据框对应于个人对团队成员看法的反应。例如,第一个数据框是团队成员 A(在团队 1 中)如何看待问题 1 和 2(Q1 和 Q2)的团队成员 B 和 C。我的目标是自动化一个流程,将这些数据框从个人响应转换为每个问题的团队级数据框,以便为这些数据框获得什么:

> T1Q1
  X A B C
1 A 0 3 2
2 B 5 0 5
3 C 2 5 0
> T1Q2
  X A B C
1 A 0 3 2
2 B 5 0 5
3 C 2 5 0

因此,0 沿对角线出现,并且逐行是每个成员针对给定问题对对方的评价。例如,在第 1 行的T1Q1 中,我们看到了 A 对 B 和 C 的看法。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    reshape2 包将使您轻松完成这项任务:

    rm(list=ls())
    
    library(reshape2)
    
    team_1_A <- data.frame(MemberA=c('C', 'B'), Q1=c(2,3), Q2=c(3,4))
    team_1_B <- data.frame(MemberB=c('A', 'C'), Q1=c(5,5), Q2=c(4,2))
    team_1_C <- data.frame(MemberC=c('A', 'B'), Q1=c(2,5), Q2=c(5,5))
    
    # store data frames in a list
    members <- list(team_1_A, team_1_B, team_1_C)
    
    # format rows/columns
    formatted <- lapply(members, function(m){
        m$Respondent <- gsub('Member', '', names(m)[1])
        names(m)[1] <- 'TeamMate'
        return(m)
    })
    formatted <- do.call('rbind', formatted)
    
    # separate questions into different data frames
    questionList <- lapply(c(1,2), function(q) formatted[,c('Respondent', 'TeamMate', paste0('Q',q))])
    
    # reshape, ensure order is correct
    questionList <- lapply(questionList, function(q) {
        q <- dcast(q, Respondent ~ TeamMate)
        q <- q[,c('Respondent', 'A', 'B', 'C')]
        return(q)
    })
    names(questionList) <- c('T1Q1', 'T1Q2')
    
    # replace NA with 0
    # etc...
    questionList
    $T1Q1
      Respondent  A  B  C
    1          A NA  3  2
    2          B  5 NA  5
    3          C  2  5 NA
    
    $T1Q2
      Respondent  A  B  C
    1          A NA  4  3
    2          B  4 NA  2
    3          C  5  5 NA
    

    【讨论】:

    • 这是一个有趣的解决方案,但它不是动态的,因为我需要一个适用于任意数量的受访者和问题的解决方案,而我不必指定受访者和问题信息。
    • 您说得对,这可能不是最好的解决方案,但您可以通过更改两行代码来概括我上面的代码:members &lt;- list(team_1_A, team_1_B, team_1_C)questionList &lt;- lapply(c(1,2)。无论您有多少数据框和问题,使这两个部分动态化应该不难......
    • 关于如何做到这一点的任何具体想法?
    • 这取决于数据帧的命名方式以及您想要的确切名称,但组装列表 members 的示例可能是 grep 名称中带有 team_ 的所有数据帧:@ 987654327@,然后将它们组合成一个列表:members &lt;- lapply(dfNames, function(x) eval(parse(text=x)))。对于创建questionListlapply 语句,只需将seq(nQuestions) 替换为c(1,2)(前提是您知道问题的数量)。
    • 哦,好吧,有道理,我接受这个答案,因为您肯定已经超越并提出了一个不错的解决方案,但数据框是 CSV 文件。所以我的最终目标是将其应用于所有 CSV 文件,然后将获得的数据帧写入具有相应名称的新 CSV 文件。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多