从数据框创建矩阵

时间:2016-01-27 09:40:09

标签: r apply

我有一个带分类值的数据框

Names   Dis   Del
    A   0-2   0-2
    A   2-4   0-2
    A   6-8   6-8
    B  8-10  8-10
    C   10+   10+

我想要的是根据此数据输出的计数数

       0-2  2-4  6-8  8-10  10+      
 0-2     1                       
 2-4     1                    
 6-8               1           
8-10                     1   
 10+                          1  

我还想导出这个数据框中创建的数据。

2 个答案:

答案 0 :(得分:2)

来自@mtoto&的评论@jogo:

table(mydf[-1])

或:

xtabs(data=mydf, ~ Dis+Del)

两者都给:

      Del
Dis    0-2 10+ 6-8 8-10
  0-2    1   0   0    0
  10+    0   1   0    0
  2-4    1   0   0    0
  6-8    0   0   1    0
  8-10   0   0   0    1

如果您想以正确的顺序(10+作为最后一个)获得级别:

mydf$Dis <- factor(mydf$Dis, levels = c("0-2","2-4","6-8","8-10","10+"))
mydf$Del <- factor(mydf$Del, levels = c("0-2","6-8","8-10","10+"))

现在你得到:

      Del
Dis    0-2 6-8 8-10 10+
  0-2    1   0    0   0
  2-4    1   0    0   0
  6-8    0   1    0   0
  8-10   0   0    1   0
  10+    0   0    0   1

使用过的数据:

mydf <- read.table(text="Names   Dis   Del
    A   0-2   0-2
    A   2-4   0-2
    A   6-8   6-8
    B  8-10  8-10
    C   10+   10+", header=TRUE)

答案 1 :(得分:0)

我认为您正在寻找dcast包中的reshape2功能。

df <- data.frame(Dis = c("0-2","2-4", "6-8", "8-10", "10+"),
                 Del = c("0-2", "0-2", "6-8", "8-10", "10+"))

将要重塑的列转换为因子。

df$Dis <- as.factor(df$Dis)
df$Del <- as.factor(df$Del)

添加count columnt以减少:

df$counts <- 1

然后应用dcast功能。我们使用两个命名列来设置新矩阵的cols / rows。 fun.aggregate确保如果您有多次出现相同的组合,那么您将获得出现次数。 如果需要二进制0/1,则将其设置为max

wide_df <- dcast(df,
                  Dis ~ Del,
                  value.var = "counts",
                  fun.aggregate = sum)

结果如下:

print(wide_df)
   Dis 0-2 10+ 6-8 8-10
1  0-2   1   0   0    0
2  10+   0   1   0    0
3  2-4   1   0   0    0
4  6-8   0   0   1    0
5 8-10   0   0   0    1

要获得与问题相同的顺序,您可以按照您想要的顺序设置第一步中的因子。