2016-08-14 78 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]