使用带有三列的扩展,其中第一列具有状态和第二过渡状态,值为第三列

时间:2015-09-15 11:33:49

标签: r

我有这样的输入。

type1   type2   2
type1   type3   4
type1   type5   3
type2   type1   6
type2   type4   2
type2   type3   3
type3   type1   2
type3   type2   2
type3   type4   4
type4   type1   7
type4   type2   1
type4   type3   4
type5   type1   2
type5   type3   3
type5   type4   1

这里,column1假设一个状态,第二列是第二个状态,第三个列具有与此转换相对应的值。所以我希望它被传播,以便我在column1中有唯一的状态,其余的列是具有所有唯一列名的名称,行中的每个单元格应包含第三列的计数。

所以输出应该是这样的。

types   type1   type2   type3   type4   type5
type1   0       2       4       0       3
type2   6       0       3       2       0
type3   2       2       0       2       0
type4   7       1       4       0       0
type5   2       0       3       1       0

我试过这个,它给出了错误:行(7,8)的重复标识符。在这种情况下,我不知道如何使用传播。

seq=read.csv("test.txt",header=FALSE,sep="\t")
colnames(seq) = c("state1","state2","counts")
seqs=spread(data=seq,state1,state2,fill=0)

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

使用reshape2解决方案非常简单:

dcast(df, V1 ~ V2, fill=0)
#     V1 type1 type2 type3 type4 type5
#1 type1     0     2     4     0     3
#2 type2     6     0     3     2     0
#3 type3     2     2     0     4     0
#4 type4     7     1     4     0     0
#5 type5     2     0     3     1     0

答案 1 :(得分:1)

我认为以下代码将为您解决此问题:

> grid <- with(d, expand.grid(V1=levels(V1), V2=levels(V2)))
> d2 <- merge(d, grid, all.y=TRUE)
> l <- split(d2[c("V2", "V3")], d2$V1)
> t(sapply(l, function(x) { ret <- x$V3; names(ret) <- x$V2; ret}))
      type1 type2 type3 type4 type5
type1    NA     2     4    NA     3
type2     6    NA     3     2    NA
type3     2     2    NA     4    NA
type4     7     1     4    NA    NA
type5     2    NA     3     1    NA

这可能不是最好看的代码,但这是我想到的。

答案 2 :(得分:0)

与此类似的问题:Rearrange dataframe to a table, the opposite of "melt"

reshape2::dcast功能效果很好。

示例:

ColA <- rep(c('a', 'b', 'c'), each=3)
ColB <- rep(c('a', 'b', 'c'), times=3)
ColC <- round(runif(9)*10, 0)
df <- data.frame(ColA, ColB, ColC)
require(reshape2)
dcast(df, ColA~ColB)

输出:

  ColA a b c
1    a 8 3 4
2    b 7 8 6
3    c 9 5 8