как создать новые переменные из одной переменной, используя два правила - PullRequest
0 голосов
/ 01 февраля 2019

Буду признателен за любую помощь в создании новых переменных из одной переменной.

В частности, мне нужна помощь для одновременного создания одной строки для каждого ID и различных столбцов E, где каждый из новыхстолбцы E, то есть E1, E2, E3) содержат значения E для каждой строки ID.Я попытался сделать это, за которым melt, за которым следует spread, но я получаю ошибку:

Ошибка: дублирующиеся идентификаторы для строк (4, 7, 9), (1, 3, 6), (2, 5, 8)

Кроме того, я попробовал обсуждаемые решения здесь и здесь , но они не сработали для моего случая, потому что мне нужноиметь возможность создавать row identifiers для строк (4, 1, 2), (7, 3, 5) и (9, 6, 8).То есть E для строк (4, 1, 2) должно быть названо E1, E для строк (7, 3, 5) должно быть названо E2, E для строк (9, 6, 8) должно быть названо E3 и т. Д.

# data

dT<-structure(list(A = c("a1", "a2", "a1", "a1", "a2", "a1", "a1", 
    "a2", "a1"), B = c("b2", "b2", "b2", "b1", "b2", "b2", "b1", 
    "b2", "b1"), ID = c("3", "4", "3", "1", "4", "3", "1", "4", "1"
    ), E = c(0.621142094943352, 0.742109450696123, 0.39439152996948, 
    0.40694392882818, 0.779607277916503, 0.550579323666347, 0.352622183880119, 
    0.690660491345867, 0.23378944873769)), class = c("data.table", 
    "data.frame"), row.names = c(NA, -9L))

# моя попытка

    A  B ID         E
1: a1 b2  3 0.6211421
2: a2 b2  4 0.7421095
3: a1 b2  3 0.3943915
4: a1 b1  1 0.4069439
5: a2 b2  4 0.7796073
6: a1 b2  3 0.5505793
7: a1 b1  1 0.3526222
8: a2 b2  4 0.6906605
9: a1 b1  1 0.2337894

aTempDF <- melt(dT, id.vars = c("A", "B", "ID")) )

    A  B  ID variable    value
1: a1 b2  3        E 0.6211421
2: a2 b2  4        E 0.7421095
3: a1 b2  3        E 0.3943915
4: a1 b1  1        E 0.4069439
5: a2 b2  4        E 0.7796073
6: a1 b2  3        E 0.5505793
7: a1 b1  1        E 0.3526222
8: a2 b2  4        E 0.6906605
9: a1 b1  1        E 0.2337894

aTempDF%>%spread(variable, value)

Error: Duplicate identifiers for rows (4, 7, 9), (1, 3, 6), (2, 5, 8)

# ожидаемый результат

    A  B  ID       E1           E2           E3
1: a1 b2  3        0.6211421    0.3943915    0.5505793
2: a2 b2  4        0.7421095    0.7796073    0.6906605 
3: a1 b1  1        0.4069439    0.3526222    0.2337894

Заранее благодарен за любую помощь.

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете использовать dcast из data.table

library(data.table)
dcast(dT, A + B + ID ~ paste0("E", rowid(ID)))
#   A  B ID        E1        E2        E3
#1 a1 b1  1 0.4069439 0.3526222 0.2337894
#2 a1 b2  3 0.6211421 0.3943915 0.5505793
#3 a2 b2  4 0.7421095 0.7796073 0.6906605

Сначала необходимо создать правильную «переменную времени», что и делает rowid(ID).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...