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

创建具有所有转换计数的data.frame,r,dataframe,R,Dataframe,假设一个data.frame: 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 一种方法是运行for循环,然后使用ifs,但我确信应该有一种更有效的方法 例如,如果项目d的排名为3,项目c的排名为4,则代码应增加d行下4to3列的计数(如上例所示)。请让我知道,如

假设一个data.frame:

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
一种方法是运行
for
循环,然后使用
ifs
,但我确信应该有一种更有效的方法

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


p.S.colnames没有那么重要。

您可以使用
Map
创建
seq
用于提取转换的结果,并使用
粘贴将它们折叠成所需的形式

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


df1啊!这就是诀窍!谢谢你发现jay.sf
df$rank[i]
在您的示例中需要更改为
df1$rank[i]
才能使用您的数据结构,但这非常有效!谢谢大家!@也许谢谢你的勘误表!我使用了
df1
,因为
df
已经是R中定义的函数。
tmp <- sapply(Map(seq, 1:(nrow(df1)-1), 2:nrow(df1)), function(i) df1$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))))
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
df1 <- structure(list(name = structure(1:5, .Label = c("a", "b", "c", 
"d", "e"), class = "factor"), rank = c(1, 1, 4, 3, 2)), class = "data.frame", row.names = c(NA, 
-5L))