我在从以下数据中删除适量信息时遇到问题:
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
你能建议一种方法来执行此操作吗?理想情况下,矢量化方法...
谢谢,
米格尔
答案 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)