创建具有所有转换计数的data.frame

问题描述 投票:0回答:1

假设一个数据框:

df <- data.frame(name = c("a","b","c","d","e"),rank = c(1,1,4,3,2))


   name rank
    a    1
    b    1
    c    4
    d    3
    e    2

基于上面的data.frame,我想创建一个新的保存从一个等级到另一个等级的转换计数。所以输出将是这样的:

  name 1to1 1to2 1to3 1to4 2to1 2to2 2to3 2to4 3to1 3to2 3to3 3to4 4to1 4to2 4to3 4to4
1    b    1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
2    c   NA   NA   NA    1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
3    d   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA    1   NA
4    e   NA   NA   NA   NA   NA   NA   NA   NA   NA    1   NA   NA   NA   NA   NA   NA

执行此操作的一种方法是运行for循环,然后使用ifs,但我很确定应该有一种更有效的方法。

例如,如果项目d的排名为3,并且项目c的排名为4,则代码应增加4to3行下的d列的计数(如以上示例)。如果不清楚,请让我知道,感谢您的帮助。

P.S。姓氏不是那么重要。

r dataframe
1个回答
0
投票

您可以使用Map创建用于提取转换的seq uence,如下所示:

tmp <- sapply(Map(seq, 1:(nrow(df1)-1), 2:nrow(df1)), function(i) df$rank[i])
v <- apply(tmp, 2, function(x) paste(x, collapse="to"))

to <- apply(expand.grid(1:4, 1:4), 1, function(x) paste(x, collapse="to"))

res <- data.frame(name=df1$name[-1], t(sapply(v, function(i) setNames(+(i == to), to))))

之后,您可以使用]将零转换为[C0

NA

结果

res[res == 0] <- NA

数据

res
#      name X1to1 X2to1 X3to1 X4to1 X1to2 X2to2 X3to2 X4to2 X1to3 X2to3 X3to3 X4to3 X1to4 X2to4 X3to4 X4to4
# 1to1    b     1    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
# 1to4    c    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA     1    NA    NA    NA
# 4to3    d    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA     1    NA    NA    NA    NA
# 3to2    e    NA    NA    NA    NA    NA    NA     1    NA    NA    NA    NA    NA    NA    NA    NA    NA
© www.soinside.com 2019 - 2024. All rights reserved.