我有这样的输入。
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)
感谢任何帮助。
答案 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