将个人响应数据帧转换为r中的团队级数据帧

时间:2015-07-30 16:36:24

标签: r dataframe

我有以下数据框:

> 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中)如何感知团队成员B和C的问题1和2(Q1和Q2)。我的目标是自动化一个流程,将每个问题的个体响应中的这些数据帧转换为团队级数据帧,以便为这些数据帧获得的内容将是:

> 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的看法。

1 个答案:

答案 0 :(得分: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