我的剪切功能有问题。我有这种情况:
codice
1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4 11OL2-074
5 11OL2-074
我希望有一个新变量“campione”由变量“codice”分割如下:
codice campione
1 11GP2-0016 [1,3]
2 11GP2-0016 [1,3]
3 11GP2-0016 [1,3]
4 11OL2-074 (4,5]
5 11OL2-074 (4,5]
如何使用cut函数拆分“codice”创建一个变量,显示从1到3我有相同的代码,从4到5个相同的代码等等?
我需要解决另一个问题。对于同样的问题,我想获得:
codice campione
1 11GP2-0016 [11GP2-0016,11GP2-0016,11GP2-0016]
2 11GP2-0016 [11GP2-0016,11GP2-0016,11GP2-0016]
3 11GP2-0016 [11GP2-0016,11GP2-0016,11GP2-0016]
4 11OL2-074 (11OL2-074,11OL2-074]
5 11OL2-074 (11OL2-074,11OL2-074]
有没有解决办法呢?
答案 0 :(得分:3)
使用您的数据:
d <- read.table(text = "1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4 11OL2-074
5 11OL2-074", row.names = 1, stringsAsFactors = FALSE)
names(d) <- "codice"
以下是使用rle()
的一个稍微复杂的例子:
drle <- with(d, rle(codice))
这为我们提供了codice
的运行长度:
> drle
Run Length Encoding
lengths: int [1:2] 3 2
values : chr [1:2] "11GP2-0016" "11OL2-074"
并且我操作的$lengths
组件创建了两个指示,即开始(ind1
)和结束(ind2
)位置:
ind1 <- with(drle, rep(seq_along(lengths), times = lengths) +
rep(c(0, head(lengths, -1) - 1), times = lengths))
ind2 <- ind1 + with(drle, rep(lengths- 1, times = lengths))
然后我将它们粘贴在一起:
d <- transform(d, campione = paste0("[", ind1, ",", ind2, "]"))
给予
> head(d)
codice campione
1 11GP2-0016 [1,3]
2 11GP2-0016 [1,3]
3 11GP2-0016 [1,3]
4 11OL2-074 [4,5]
5 11OL2-074 [4,5]
答案 1 :(得分:3)
这样做。如果需要,可以添加括号/ parens。
dat <- read.table(text='codice
1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4 11OL2-074
5 11OL2-074', header=TRUE)
within(dat,
campione <- with(rle(as.character(codice)), {
starts <- which(! duplicated(codice))
ends <- starts + lengths - 1
inverse.rle(list(values=paste(starts, ends, sep=','), lengths=lengths))
})
)
# codice campione
# 1 11GP2-0016 1,3
# 2 11GP2-0016 1,3
# 3 11GP2-0016 1,3
# 4 11OL2-074 4,5
# 5 11OL2-074 4,5
答案 2 :(得分:2)
另一种方法是使用rank
:
left <- rank(factor(d$codice), ties.method = "min")
right <- rank(factor(d$codice), ties.method = "max")
d$campione <- paste("[", left, ",", right, "]", sep = "")