在数据框变量中查找唯一字符串

3

我有一个数据框,其中包含几个字符变量,我想找到每行中唯一的字符串。每行中只有一个特定的字符串在多个列中重复出现,被NA包围。例如,数据框“df”:

  Col1 Col2 Col3
1 ABC  ABC  NA
2  NA  DEF  DEF
3 GHI  NA   NA
4 JKL  JKL  JKL

作为输出,我希望得到:
ABC
DEF
GHI
JKL

最好是针对每一行有一种类似于应用函数的功能。我尝试了几个不同版本的...
apply(df,1, function(x) unique(x))

但那并没有成功。如果您知道正确的函数,我认为有一个相当简单的方法。我该怎么做?


1
如果每行只有一个唯一元素(可能在该行中重复或不重复),则可以使用 df[cbind(1:nrow(df), max.col(!is.na(df)))] 而无需循环。 - talat
2个回答

3
我们可以使用is.na来删除NA元素。
unname(apply(df, 1, FUN = function(x) unique(x[!is.na(x)])))
#[1] "ABC" "DEF" "GHI" "JKL"

如果每行有一个以上的唯一元素,它会以列表的形式返回(取决于每行元素数量是否不同)。在这种情况下,我们可以使用“paste”将它们粘合在一起创建一个字符串。
unname(apply(df, 1, FUN = function(x) toString(unique(x[!is.na(x)])))) 

如果每行只有一个唯一元素,另一个选择是使用pmax

 do.call(pmax, c(df, list(na.rm=TRUE)))
 #[1] "ABC" "DEF" "GHI" "JKL"

1
谢谢,Akrun。第一种方法是我首选的方法。正如我所想,我离解决方案并不太远。但是,我不需要unname。 - Rockbar

1
另一个选项。
levels(unlist(df))

我认为如果几行具有相同的唯一值,那么这可能会失败,因为它们只会被报告一次(级别),而不是每行都报告。 - talat
@docendodiscimus:当然。这是特定情况下的解决方案。我认为在这个问题中,这是实现目标最简单的方法。 - user2100721

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接