Как объединить строки с разным вводом - PullRequest
1 голос
/ 25 марта 2019

У меня df выглядит так:

EXP   G   NA   NA     NA      NA 
EXP   D   1   NAME    2     NUMBER
EXP   D   1   NAME    2     NUMBER
EXP   G   NA   NA     NA      NA 
EXP   D   1   NAME    2     NUMBER
EXP   D   1   NAME    2     NUMBER

df = data.frame(Exp = rep('EXP', 6),
            Code = rep(c('G', 'D', 'D')),
            Name.num = rep(c(NA, 1, 1)),
            Name = rep(c(NA, 'NAME', 'NAME')),
            Number.num = rep(c(NA, 2, 2)),
            Number = rep(c(NA, 'NUMBER', 'NUMBER')))

И я бы хотел получить такой вывод:

EXP  G   NA   NA  
EXP  D   1    NAME
EXP  D   2    NUMBER
EXP  G   NA   NA  
EXP  D   1    NAME
EXP  D   2    NUMBER

Где только в одном столбце я могу иметь оба (Числа и имена) в одном столбце.

Есть предложения? До сих пор я пытался с reshape на основе ответа на этот вопрос , так как я не хочу использовать пакеты, но у меня ничего не получилось.

df = reshape(df, direction = 'wide', varying = list(df)[c(4,6)],
         idvar = c('Name.num', 'Number.num', 'Name', 'Number'))

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Если ваш шаблон всегда один и тот же, это очень простой способ сделать это:

df = data.frame(Exp = rep('EXP', 6),
            Code = rep(c('G', 'D', 'D')),
            Name.num = rep(c(NA, 1, 1)),
            Name = rep(c(NA, 'NAME', 'NAME')),
            Number.num = rep(c(NA, 2, 2)),
            Number = rep(c(NA, 'NUMBER', 'NUMBER')),stringsAsFactors = FALSE)
ss=seq(1,nrow(df),by=3)
df$out=NA

sapply(ss,function(x){
  df$out[x]<<-NA
  df$out[x+1]<<-df$Name[x+1]
  df$out[x+2]<<-df$Number[x+2]
  df$Name.num[x+2]<<- 2
})
df_out=df[,c(1,2,3,7)]

  Exp Code Name.num    out
1 EXP    G       NA   <NA>
2 EXP    D        1   NAME
3 EXP    D        2 NUMBER
4 EXP    G       NA   <NA>
5 EXP    D        1   NAME
6 EXP    D        2 NUMBER
1 голос
/ 25 марта 2019

с использованием data.table

melt( setDT(df), 
    id.vars = c("Exp", "Code"), 
    measure.vars = patterns( num = "^.*\\.num", 
                             val = "^Name$|^Number$" )
    )[, variable :=NULL ][]

производит:

#     Exp Code num    val
#  1: EXP    G  NA   <NA>
#  2: EXP    D   1   NAME
#  3: EXP    D   1   NAME
#  4: EXP    G  NA   <NA>
#  5: EXP    D   1   NAME
#  6: EXP    D   1   NAME
#  7: EXP    G  NA   <NA>
#  8: EXP    D   2 NUMBER
#  9: EXP    D   2 NUMBER
# 10: EXP    G  NA   <NA>
# 11: EXP    D   2 NUMBER
# 12: EXP    D   2 NUMBER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...