我有一个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'))
答案 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