如何合并具有不同输入的行

时间:2019-03-25 10:09:57

标签: r dataframe

我有一个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

在只有一列的地方,我可以在同一列中同时包含(数字和名称)。

有什么建议吗? 到目前为止,我基于this question的答案尝试使用reshape,因为我不想使用软件包,但没有成功。

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

2 个答案:

答案 0 :(得分:1)

如果您的模式始终相同,这是一种非常简单的方法:

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 :(得分:0)

使用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