Получение данных в одну строку в несколько строк - PullRequest
1 голос
/ 23 мая 2019

У меня есть код, где я вижу, какие люди работают в определенных группах. Когда я прошу лидера каждой группы представить тех, кто работает на них, в опросе, я получаю ряд всех членов команды. Что мне нужно, так это очистить данные в несколько строк с их информацией о группе.

Я не знаю с чего начать.

Вот так выглядит мой фрейм данных,

LeaderName <- c('John','Jane','Louis','Carl')

Group <- c('3','1','4','2')

Member1 <- c('Lucy','Stephanie','Chris','Leslie')

Member1ID <- c('1','2','3','4')

Member2 <- c('Earl','Carlos','Devon','Francis')

Member2ID <- c('5','6','7','8')

Member3 <- c('Luther','Peter','','Severus')

Member3ID <- c('9','10','','11')

GroupInfo <- data.frame(LeaderName, Group, Member1, Member1ID, Member2 ,Member2ID, Member3, Member3ID)

Это то, что я хотел бы показать с определенным кодом

LeaderName_ <- c('John','Jane','Louis','Carl','John','Jane','Louis','Carl','John','Jane','','Carl')

Group_ <- c('3','1','4','2','3','1','4','2','3','1','','2')

Member <- c('Lucy','Stephanie','Chris','Leslie','Earl','Carlos','Devon','Francis','Luther','Peter','','Severus')

MemberID <- c('1','2','3','4','5','6','7','8','9','10','','11')

ActualGroupInfor <- data.frame(LeaderName_,Group_,Member,MemberID)

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вот решение в base r:

reshape(
 data=GroupInfo, 
 idvar=c("LeaderName", "Group"),
 varying=list(
  Member=which(names(GroupInfo) %in% grep("^Member[0-9]$",names(GroupInfo),value=TRUE)),
  MemberID=which(names(GroupInfo) %in% grep("^Member[0-9]ID",names(GroupInfo),value=TRUE))), 
 direction="long", 
 v.names = c("Member","MemberID"),
 sep="_")[,-3]
#>           LeaderName Group    Member MemberID
#> John.3.1        John     3      Lucy        1
#> Jane.1.1        Jane     1 Stephanie        2
#> Louis.4.1      Louis     4     Chris        3
#> Carl.2.1        Carl     2    Leslie        4
#> John.3.2        John     3      Earl        5
#> Jane.1.2        Jane     1    Carlos        6
#> Louis.4.2      Louis     4     Devon        7
#> Carl.2.2        Carl     2   Francis        8
#> John.3.3        John     3    Luther        9
#> Jane.1.3        Jane     1     Peter       10
#> Louis.4.3      Louis     4                   
#> Carl.2.3        Carl     2   Severus       11

Создано в 2019-05-23 с помощью пакета Представить (v0.2.1)

1 голос
/ 23 мая 2019

Опция будет melt из data.table и указать имя столбца patterns в параметре measure

library(data.table)
melt(setDT(GroupInfo), measure = patterns("^Member\\d+$", 
    "^Member\\d+ID$"), value.name = c("Member", "MemberID"))[, variable := NULL][]
#    LeaderName Group    Member MemberID
# 1:       John     3      Lucy        1
# 2:       Jane     1 Stephanie        2
# 3:      Louis     4     Chris        3
# 4:       Carl     2    Leslie        4
# 5:       John     3      Earl        5
# 6:       Jane     1    Carlos        6
# 7:      Louis     4     Devon        7
# 8:       Carl     2   Francis        8
# 9:       John     3    Luther        9
#10:       Jane     1     Peter       10
#11:      Louis     4                   
#12:       Carl     2   Severus       11
...