преобразовать значение одного столбца в разные упорядоченные столбцы в R - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующая таблица:

ID PRO POS
1  A   1
1  B   2
1  C   3
1  D   4
2  A   1
2  B   2
2  C   3
3  A   1
3  B   2

Для каждого идентификатора я хотел бы получить столбцы позиции в разные столбцы и скопировать значение PRO в соответствующий столбец, который будет в этом формате:

ID PRO POS 1 2 3 4
1  A   1   A B C D
1  B   2   A B C D
1  C   3   A B C D
1  D   4   A B C D
2  A   1   A B C NA
2  B   2   A B C NA
2  C   3   A B C NA
3  A   1   A B NA NA
3  B   2   A B NA NA

Каков оптимальный способ сделать это в R без написания многих ifelse операторов?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Другое предложение с использованием data.table

rbindlist(
    DT[, .(.(cbind(ID, .SD, t(structure(PRO, names=POS))))), by=ID]$V1, 
    use.names=TRUE, fill=TRUE)

#   ID PRO POS 1 2  3  4
#1:  1   A   1 A B  C  D
#2:  1   B   2 A B  C  D
#3:  1   C   3 A B  C  D
#4:  1   D   4 A B  C  D
#5:  2   A   1 A B  C NA
#6:  2   B   2 A B  C NA
#7:  2   C   3 A B  C NA
#8:  3   A   1 A B NA NA
#9:  3   B   2 A B NA NA

Эквивалент в базе:

rbindlist(
    by(DT, DT$ID, function(x) cbind(x, t(structure(x$PRO, names=x$POS)))),
    use.names=TRUE, fill=TRUE)

data:

library(data.table)
DT <- fread("ID PRO POS
1  A   1
1  B   2
1  C   3
1  D   4
2  A   1
2  B   2
2  C   3
3  A   1
3  B   2")
0 голосов
/ 24 мая 2018

Решение с использованием tidyverse.Мы можем распространить фрейм данных и объединить их с оригинальным фреймом данных.dat2 - это конечный результат.

library(tidyverse)

dat2 <- dat %>%
  spread(POS, PRO) %>%
  left_join(dat, ., by = "ID")
dat2
#   ID PRO POS 1 2    3    4
# 1  1   A   1 A B    C    D
# 2  1   B   2 A B    C    D
# 3  1   C   3 A B    C    D
# 4  1   D   4 A B    C    D
# 5  2   A   1 A B    C <NA>
# 6  2   B   2 A B    C <NA>
# 7  2   C   3 A B    C <NA>
# 8  3   A   1 A B <NA> <NA>
# 9  3   B   2 A B <NA> <NA>

ДАННЫЕ

dat <- read.table(text = "ID PRO POS

1  A   1
                  1  B   2
                  1  C   3
                  1  D   4
                  2  A   1
                  2  B   2
                  2  C   3
                  3  A   1
                  3  B   2",
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...