首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按因子级别拆分的Cut函数

按因子级别拆分的Cut函数
EN

Stack Overflow用户
提问于 2012-10-18 23:25:56
回答 3查看 1.2K关注 0票数 5

我对cut函数有一个问题。我有这样的情况:

代码语言:javascript
复制
 codice
1 11GP2-0016
2 11GP2-0016
3 11GP2-0016
4  11OL2-074
5  11OL2-074    

我希望有一个新的变量"campione“被变量"codice”拆分,如下所示:

代码语言:javascript
复制
    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相同的代码等等?

我需要解决另一个问题。对于相同的问题,我希望获得:

代码语言:javascript
复制
 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]

有什么解决方案可以解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-18 23:57:47

这样就可以了。如果需要,您可以添加方括号/括号。

代码语言:javascript
复制
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       
票数 3
EN

Stack Overflow用户

发布于 2012-10-18 23:51:30

使用您的数据:

代码语言:javascript
复制
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()的稍微复杂的示例

代码语言:javascript
复制
drle <- with(d, rle(codice))

这为我们提供了codice的运行长度

代码语言:javascript
复制
> drle
Run Length Encoding
  lengths: int [1:2] 3 2
  values : chr [1:2] "11GP2-0016" "11OL2-074"

我操作的$lengths组件创建了两个指示,开始位置(ind1)和结束位置(ind2):

代码语言:javascript
复制
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))

然后我将这些粘贴在一起:

代码语言:javascript
复制
d <- transform(d, campione = paste0("[", ind1, ",", ind2, "]"))

给予

代码语言:javascript
复制
> 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]
票数 3
EN

Stack Overflow用户

发布于 2012-10-19 06:46:13

另一种方法是使用rank

代码语言:javascript
复制
left <- rank(factor(d$codice), ties.method = "min")
right <- rank(factor(d$codice), ties.method = "max")
d$campione <- paste("[", left, ",", right, "]", sep = "")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12958170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档