R 将基于行的迁移数据转换为迁移矩阵

R 将基于行的迁移数据转换为迁移矩阵,r,R,我有基于行的迁移数据 param <- c("A", "B", "C") df <- data.frame(Case1 = c("A", "A", "B", "B"), Case2 = c("A", "C", "A", "B"), Val = c(0.5,0.4,0.3,0.7)) 所以迁移矩阵看起来像 案例2_A案例2_B案例2_C 案例1_A 0.5 0.0 0.4 案例1_B 0.3 0.7 0.0 案例1_C 0.

我有基于行的迁移数据

param <- c("A", "B", "C") 
df <- data.frame(Case1 = c("A", "A", "B", "B"), 
             Case2 = c("A", "C", "A", "B"), 
             Val = c(0.5,0.4,0.3,0.7))
所以迁移矩阵看起来像


案例2_A案例2_B案例2_C
案例1_A 0.5 0.0 0.4
案例1_B 0.3 0.7 0.0
案例1_C 0.0 0.0 0.0


有人知道在R中这样做的好方法吗?多谢各位

您可以使用
dplyr
tidyr

library(dplyr); library(tidyr)

df %>% 
       complete(Case1 = LETTERS[1:3], Case2 = LETTERS[1:3]) %>% 
       mutate_at(vars(starts_with("Case")), funs(paste("Case", ., sep = "_"))) %>% 
       spread(Case2, Val, fill = 0.0)

# Source: local data frame [3 x 4]

#   Case1 Case_A Case_B Case_C
#   <chr>  <dbl>  <dbl>  <dbl>
#1 Case_A    0.5    0.0    0.4
#2 Case_B    0.3    0.7    0.0
#3 Case_C    0.0    0.0    0.0
库(dplyr);图书馆(tidyr)
df%>%
完成(案例1=字母[1:3],案例2=字母[1:3])%>%
在(变量(以“Case”开头)、funs(粘贴(“Case”),sep=“”))%处进行变异%>%
排列(案例2,Val,填充=0.0)
#来源:本地数据帧[3 x 4]
#案例1案例A案例B案例C
#         
#1例(A 0.5 0.0 0.4)
#2例B 0.3 0.7 0.0
#3例0.0.0.0
或者,如果您想特别保留列号:

df %>% 
      complete(Case1 = LETTERS[1:3], Case2 = LETTERS[1:3]) %>% 
      mutate(Case1 = paste('Case1', Case1, sep = "_"), 
             Case2 = paste('Case2', Case2, sep = "_")) %>% 
      spread(Case2, Val, fill = 0.0)

# Source: local data frame [3 x 4]

#     Case1 Case2_A Case2_B Case2_C
#     <chr>   <dbl>   <dbl>   <dbl>
# 1 Case1_A     0.5     0.0     0.4
# 2 Case1_B     0.3     0.7     0.0
# 3 Case1_C     0.0     0.0     0.0
df%>%
完成(案例1=字母[1:3],案例2=字母[1:3])%>%
突变(Case1=paste('Case1',Case1,sep=“”),
Case2=粘贴('Case2',Case2,sep=“\u”))%>%
排列(案例2,Val,填充=0.0)
#来源:本地数据帧[3 x 4]
#案例1案例2_A案例2_B案例2_C
#              
#1宗个案1_A 0.50.0 0.4
#2案例1_B 0.3 0.7 0.0
#3案例1_C 0.0 0.0 0.0
带基数R:

df

  Case1 Case2 Val
1     A     A 0.5
2     A     C 0.4
3     B     A 0.3
4     B     B 0.7

library(reshape2)
levels(df$Case1) <- c(levels(df$Case1), 'C')
df <- dcast(df, Case1~Case2, value.var='Val', drop=FALSE)
rownames(df) <- paste('Case1', df[,1], sep='_')
df <- df[-1]
names(df) <- paste('Case2', names(df), sep='_')
df[is.na(df)] <- 0.0
df

     Case2_A Case2_B Case2_C
Case1_A     0.5     0.0     0.4
Case1_B     0.3     0.7     0.0
Case1_C     0.0     0.0     0.0
df
案例1案例2 Val
1 A 0.5
2 A C 0.4
3 B A 0.3
4B0.7
图书馆(E2)

级别(df$Case1)A
base R
选项将在将前两列转换为
factor
后使用
xtabs
,其中
levels
指定为
unlist
ed列中的
唯一
级别,以便不会删除某些组合

Un1 <- sort(unique(unlist(df[1:2])))
df[1:2] <- lapply(df[1:2], factor, levels = Un1)
res <- xtabs(Val~Case1+Case2, df)
Un1 <- sort(unique(unlist(df[1:2])))
df[1:2] <- lapply(df[1:2], factor, levels = Un1)
res <- xtabs(Val~Case1+Case2, df)
dimnames(res) <- Map(paste, names(dimnames(res)), dimnames(res), MoreArgs = list(sep="_"))
names(dimnames(res)) <- NULL
res
#         Case2_A Case2_B Case2_C
#Case1_A     0.5     0.0     0.4
#Case1_B     0.3     0.7     0.0
#Case1_C     0.0     0.0     0.0