我有一个包含多列(control.sub
)的数据框(t1,t2,t3,t4,t5,t6
)。我想将所有这些列合并为一个,也应删除NA。
> control.sub
t1 t2 t3 t4
29 5500024017802120306174.H01 5500024017802120306174.G02 5500024017802120306174.E03 5500024017802120306174.D04
810 5500024030401071707292.H01 5500024030401071707292.G02 5500024030401071707292.E03 5500024030401071707292.D04
4693 5500024035736031208612.G08 5500024035736031208612.E09 5500024035736031208612.D10 5500024035736031208612.B11
t5 t6
29 5500024017802120306174.B05 5500024017802120306174.A06
810 5500024030401071707292.B05 5500024030401071707292.A06
4693 5500024035736031208612.A12 <NA>
我希望最终结果如下:
> control.sub
t1
29 5500024017802120306174.H01 5500024017802120306174.G02 5500024017802120306174.E03 5500024017802120306174.D04
810 5500024030401071707292.H01 5500024030401071707292.G02 5500024030401071707292.E03 5500024030401071707292.D04
4693 5500024035736031208612.G08 5500024035736031208612.E09 5500024035736031208612.D10 5500024035736031208612.B11
5500024017802120306174.B05 5500024017802120306174.A06
5500024030401071707292.B05 5500024030401071707292.A06
5500024035736031208612.A12
包含所有值的一列(t1)。
答案 0 :(得分:1)
df <- data.frame(t1 = c(letters[1:5],NA), t2 = c(NA, LETTERS[6:10]),
t3 = c(11:12,NA,13:15), stringsAsFactors=FALSE)
df
# t1 t2 t3
# 1 a <NA> 11
# 2 b F 12
# 3 c G NA
# 4 d H 13
# 5 e I 14
# 6 <NA> J 15
df2 <- data.frame(t1 = apply(df, 1, function(s) paste(s[!is.na(s)], collapse=" ")) )
df2
# t1
# 1 a 11
# 2 b F 12
# 3 c G
# 4 d H 13
# 5 e I 14
# 6 J 15
修改强>
我认为OP正在寻找这个,但他/她的例子是错误的:
unlist_not_na <- function(df){
v <- unlist(df)
v[!is.na(v)]
}
df3 <- data.frame(t1 = unlist_not_na(df))
df3
# t1
# t11 a
# t12 b
# t13 c
# t14 d
# t15 e
# t22 F
# t23 G
# t24 H
# t25 I
# t26 J
# t31 11
# t32 12
# t34 13
# t35 14
# t36 15
答案 1 :(得分:0)
以下代码有效,但我不知道是否有人会考虑它&#34;最佳&#34;:
var <- as.vector(do.call('c',control.sub))
我建议你在生成control.sub的代码中更高(如果可能),然后在那里操作输出格式。
如果您的变量是因素(您可以通过运行来检查:)
sapply(control.sub,class)
然后你应该先运行:
controlsub<-lapply(control.sub,as.character)
编辑:这是更好的:
var <- unlist(control.sub)