我有一个字符矩阵,有很多NA。我想创建一个新变量,它将所有(非NA)字符串合并为一个。所以来自
(df = data.frame(matrix(c("A", "B", "C", NA, NA, "E", NA, "D", "A", "C", "B", "C", NA, "C", "A"), ncol = 3)))
X1 X2 X3
1 A E B
2 B <NA> C
3 C D <NA>
4 <NA> A C
5 <NA> C A
然后我会
X1 X2 X3 newvar
1 A E B A:B:E
2 B <NA> C B:C
3 C D <NA> C:D
4 <NA> A C A:C
5 <NA> C A A:C
请注意,单个字母按字母顺序排列,因此我在最后两行中未获得"A:C"
和"C:A"
。
我试过
within(df, newvar <- factor(X1:X2:X3))
给出了
X1 X2 X3 newvar
1 A E B A:E:B
2 B <NA> C <NA>
3 C D <NA> <NA>
4 <NA> A C <NA>
5 <NA> C A <NA>
但是NAs的存在会覆盖聚合。
答案 0 :(得分:3)
试试这个..
df$newvar <- apply(df,1, function(x) paste( sort( na.omit(x) ) , collapse = ":") )
# X1 X2 X3 newvar
#1 A E B A:B:E
#2 B <NA> C B:C
#3 C D <NA> C:D
#4 <NA> A C A:C
#5 <NA> C A A:C
我们apply
的{{1}}行中的data.frame
功能会删除NA值,对剩余值进行排序并将其与":"
粘贴在一起作为分隔符,并将它们分配给新列newvar
中的data.frame
。