【问题标题】:Remove Duplicated String in a Row连续删除重复的字符串
【发布时间】:2015-01-26 05:52:23
【问题描述】:

以下问题:

我有一个包含多个条目的变量的数据框 data1:

data1 <- data.frame(v1 = c("test, test, bird", "bird, bird", "car"))

现在我想删除每一行中的重复条目。结果应如下所示:

data1.final <- data.frame(v1 = c("test, bird", "bird", "car"))

我试过了:

data1$ID <- 1:nrow(data1)
data1$v1 <- as.character(data1$v1)

data1 <- split(data1, data1$ID)
reduce.words <- function(x) {
  d <- unlist(strsplit(x$v1, split=" "))
  d <- paste(d[-which(duplicated(d))], collapse = ' ')
  x$v1 <- d 
  return(x)
}
data1 <- lapply(data1, reduce.words)
data1 <- as.data.frame(do.call(rbind, data1))

但是,这会产生空行,第一行除外。有没有人想办法解决这个问题?

【问题讨论】:

    标签: r duplicates collapse


    【解决方案1】:

    您的工作流程似乎相当复杂。只创建一个适用于行的简单函数怎么样?

    reduce_row = function(i) {
      split = strsplit(i, split=", ")[[1]]
      paste(unique(split), collapse = ", ") 
    }
    

    然后使用apply

    data1$v2 = apply(data1, 1, reduce_row)
    

    得到

    R> data1
                    v1         v2
    1 test, test, bird test, bird
    2       bird, bird       bird
    3              car        car
    

    【讨论】:

      【解决方案2】:

      另一个使用cSplit 的选项来自splitstackshape

      library(splitstackshape)
      cSplit(cbind(data1, indx=1:nrow(data1)), 'v1', ', ', 'long')[,
              toString(v1[!duplicated(v1)]), 
                                        by=indx][,indx:=NULL][]
        #          V1
        #1: test, bird
        #2:       bird
        #3:        car
      

      或者像 cmets 中提到的@Ananda Mahto 那样

       unique(cSplit(as.data.table(data1, keep.rownames = TRUE),
                          "v1", ",", "long"))[, toString(v1), by = rn]
      
       #   rn         V1
       #1:  1 test, bird
       #2:  2       bird
       #3:  3        car
      

      【讨论】:

      • (+1)。我个人的偏好(不确定它是否更有效)是使用keep.rownamesunique,所以改用unique(cSplit(as.data.table(data1, keep.rownames = TRUE), "v1", ",", "long"))[, toString(v1), by = rn]
      • @AnandaMahto 谢谢,没想到keep.rownames 是个不错的选择。
      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多