R:从逗号分隔的字符串

时间:2016-08-17 09:20:35

标签: r csv duplicates

我在从以下数据中删除适量信息时遇到问题:

  

18,14,17,2,9,8
  17,17,17,14
  18,14,17,2,1,1,1,1,9,8,1,1,1

我正在申请!复制以删除重复项。

SplitFunction <- function(x) {
  b <- unlist(strsplit(x, '[,]'))
  c <- b[!duplicated(b)]
  return(paste(c, collapse=","))
}

我在删除连续重复项时遇到问题。以下结果是我得到的。

  

18,14,17,2,9,8
  17,14
  18,14,17,2,1,9,8

以下数据是我想要获得的。

  

18,14,17,2,9,8
  17,14
  18,14,17,2,1,9,8,1

你能建议一种方法来执行此操作吗?理想情况下,矢量化方法...
谢谢,
米格尔

3 个答案:

答案 0 :(得分:4)

你可以使用rle函数来解决这个问题。

xx <- c("18,14,17,2,9,8","17,17,17,14","18,14,17,2,1,1,1,1,9,8,1,1,1")
zz <- strsplit(xx,",")
sapply(zz,function(x) rle(x)$value)

您可以参考此链接。 How to remove/collapse consecutive duplicate values in sequence in R?

答案 1 :(得分:3)

我们可以使用rle

sapply(strsplit(x, ','), function(x) paste(inverse.rle(within.list(rle(x), 
            lengths <- rep(1, length(lengths)))), collapse=","))
#[1] "18,14,17,2,9,8"     "17,14"              "18,14,17,2,1,9,8,1"

数据

x <- c('18,14,17,2,9,8', '17,17,17,14', '18,14,17,2,1,1,1,1,9,8,1,1,1')

答案 2 :(得分:2)

很棒的答案。这只是为了添加一个没有rle的替代方案。这给出了一个数字向量列表,但当然可以很容易地扩展为返回字符串:

numbers <- c("18,14,17,2,9,8", "17,17,17,14", "14,17,18,2,9,8,1", "18,14,17,11,8,9,8,8,22,13,6", "14,17,2,9,8", "18,14,17,2,1,1,1,1,1,1,1,1,9,8,1,1,1,1") 
result <- sapply(strsplit(numbers, ","), function(x) x[x!=c(x[-1],Inf)])
print(result)