Создайте data.frame со всеми переходами - PullRequest
1 голос
/ 18 марта 2020

Предположим, что 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

Основываясь на вышеупомянутом 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 l oop, а затем использовать ifs, но я почти уверен, что должно быть более эффективный способ сделать это.

Например, если элемент d имеет ранг 3, а элемент c оценивается как 4, тогда код должен увеличить количество столбцов 4to3 в d ' s строка (как в примере выше). Пожалуйста, дайте мне знать, если это неясно, и я ценю всю помощь.

PS Имена не очень важны.

1 Ответ

2 голосов
/ 18 марта 2020

Вы можете использовать Map, чтобы создать seq функции для извлечения переходов и свернуть их в нужную форму, используя paste.

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))))

После этого вы можете преобразовать нули в 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

Данные

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...