2016-08-14 81 views
0

我的數據是這樣的:的R - 創建跨列逐行唯一值的拼接列

df <- data.frame(id=1:8, 
f1 = c("A","B","B","C","C","C","A","A"), 
f2 = c("A",NA,"B",NA,"B","A","B","A"), 
f3 = c("A",NA,NA,NA,NA,"A","C","C")) 

我想創建是一個包含目前各行的唯一值的列(NAS排除)。所以結果將會是「f_values」列:

id f1 f2 f3 f_values 
1 1 A A A  A 
2 2 B <NA> <NA>  B 
3 3 B B <NA>  B 
4 4 C <NA> <NA>  C 
5 5 C B <NA>  CB 
6 6 C A A  CA 
7 7 A B C  ABC 
8 8 A A C  AC 

row1是A b/c只有A出現。 row6是CA,因爲C和A顯示唯一。我將這個函數描述爲按行粘貼。我知道可以將許多比較運算符和粘貼語句連接在一起,但真正的數據有更多的列,所以我希望有人知道更簡單的方法。

+0

請注意,您必須在問題出兩種不同的'df's –

回答

1

鑑於上述df

f_values<- sapply(apply(df[,-1],1, unique),function(x) paste(na.omit(x),collapse = "")) 
df_new<-cbind(df,f_values) 

df_new將是理想的結果作爲制定你的問題。

+3

你可以做這一切在'申請()',而不必使用兩個循環。 'apply(df [-1],1,function(x)paste0(na.omit(unique(x)),collapse =「」))' –

+0

如果你想發表你的評論作爲答案,我會選擇它是正確的。這絕對是最簡單的方法。 – user3055034

1

我們也可以在data.table中用'id'分組來做到這一點。

library(data.table) 
setDT(df)[, f_values := paste(na.omit(unique(unlist(.SD))), collapse="") , id]