【问题标题】:find unique strings in data frame variables在数据框变量中查找唯一字符串
【发布时间】:2016-07-14 07:20:10
【问题描述】:

我有一个包含多个字符变量的数据框,我想在每一行中找到唯一的字符串。每行只有一个特定的字符串在几列中重复,并被 NA 包围。 IE。数据框“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))

但这并不成功。我认为有一个很简单的方法,如果你知道正确的功能?我该怎么做?

【问题讨论】:

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

标签: r dataframe character unique elements


【解决方案1】:

我们可以使用is.na 来移除NA元素

unname(apply(df, 1, FUN = function(x) unique(x[!is.na(x)])))
#[1] "ABC" "DEF" "GHI" "JKL"

如果每行有多个unique 元素,它将作为list 返回(取决于每行的元素数量是否不同)。在这种情况下,我们可以将它们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"

【讨论】:

  • 谢谢,阿克伦。第一种是我喜欢的方法。正如我所假设的那样,我离解决方案并不遥远。但是,我不需要匿名。
【解决方案2】:

另一种选择

levels(unlist(df))

【讨论】:

  • 我认为如果几行具有相同的唯一值,这可能会失败,因为它们只会被报告一次(级别)而不是每一行
  • @docendodiscimus :当然。这是情况指定的解决方案。我认为这是在这个特定问题中实现目标的最简单方法。
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 2023-03-02
  • 2014-08-25
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多