【问题标题】:How to remove duplicate values from different rows per unique identifier?如何从每个唯一标识符的不同行中删除重复值?
【发布时间】:2020-05-16 03:56:27
【问题描述】:

我刚开始使用 R。我有一个数据集,第一列是唯一标识符(1958 名患者),在列 2-35 0's en 1's

例如:

Patient A:  0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 NA NA 

我想把它改成:

Patient A: 0 1 0 1 0 1

提前致谢。

【问题讨论】:

    标签: r dataframe duplicates


    【解决方案1】:

    我们可以使用tapply 并根据变量是否改变值对变量进行分组,即

    tapply(x[!is.na(x)], cumsum(c(TRUE, diff(x[!is.na(x)]) != 0)), FUN = unique)
    
    #1 2 3 4 5 6 
    #0 1 0 1 0 1 
    

    【讨论】:

      【解决方案2】:

      根据您的示例,尚不清楚 NA 是否也可以出现在中间,以及您希望如何处理这种情况(例如将 1 NA 1 设置为 1 1(选项 1),因此将两者结合起来1,或者 NA 是否会标记边界并且您会保留两个 1(选项 2)。 这决定了在什么时候删除代码中的 NA。

      您可以使用 S4Vectors 运行长度编码,这将允许您拥有不止 0 和 1。

      library(S4Vectors)
      
      ## create example data
      set.seed(1)
      x <- sample(c(0,1), (1958*34), replace=TRUE, prob=c(.4, .6))
      x[sample(length(x), 200)] <- NA
      x <- matrix(x, nrow=1958, ncol=34)
      df <- data.frame(patient.id = paste0("P", seq_len(1958)), x, stringsAsFactors = FALSE)
      
      ## define function to remove NA values
      # option 1
      fun.NA.boundary <- function(x) {
          a <- runValue(Rle(x))
          a[!is.na(a)]
      }
      # option 2
      fun.NA.remove <- function(x) runValue(Rle(x[!is.na(x)]))
      
      ## calculate results
      # option 1
      reslist <- apply(x[,-1], 1, function(y) fun.NA.boundary(y))
      
      # option 2
      reslist <- apply(x[,-1], 1, function(y) fun.NA.remove(y))
      
      names(reslist) <- df$patient.id
      head(reslist)
      #> $P1
      #>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
      #> 
      #> $P2
      #>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
      #> 
      #> $P3
      #>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1
      #> 
      #> $P4
      #>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
      #> 
      #> $P5
      #>  [1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
      #> 
      #> $P6
      #>  [1] 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
      

      【讨论】:

        猜你喜欢
        • 2015-01-02
        • 2018-09-29
        • 2020-04-30
        • 2020-05-24
        • 1970-01-01
        • 2019-10-24
        • 2015-06-11
        • 2018-07-10
        • 2021-08-04
        相关资源
        最近更新 更多