【问题标题】:eliminating continuous values消除连续值
【发布时间】:2019-02-17 03:15:55
【问题描述】:
Des          Price                                New column 

a   27.82 / 27.82 / 23.65 / 27.82                   27.82 / 23.65 / 27.82

b   19.87 / 19.87 / 19.14 / 19.87                   19.87 / 19.14 / 19.87

c   32.25 / 32.25 / 31 / 32.25 / 31                 32.25 / 31 / 32.25 / 31

d   79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39   79.39 / 83.36 / 79.39

我有一个价格列。我需要只消除连续重复值的新列。请建议。我第一行,因为 27.82 是连续重复的,所以应该设为 1,输出应该是 27.82/23.65/27.82

【问题讨论】:

标签: r


【解决方案1】:

数据: 数据 价格 1 个 27.82 / 27.82 / 23.65 / 27.82 2 b 19.87 / 19.87 / 19.14 / 19.87 3 c 32.25 / 32.25 / 31 / 32.25 / 31 4 天 79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39

代码:

data$`New Column`<-gsub("\\b([\\w\\.]+)( / \\1\\b)+","\\1",data$price,perl = T)

结果:

Des价格新栏目 1 个 27.82 / 27.82 / 23.65 / 27.82 27.82 / 23.65 / 27.82 2 b 19.87 / 19.87 / 19.14 / 19.87 19.87 / 19.14 / 19.87 3 c 32.25 / 32.25 / 31 / 32.25 / 31 32.25 / 31 / 32.25 / 31 4 天 79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39 79.39 / 83.36 / 79.39

【讨论】:

  • 知道了。但是,我们可以为数据提供一个新的维度。例如,在新列中我们有 27.82 / 23.65 / 27.82,那么我们可以添加另一列并告诉我们,价格下降和上升。我的意思是初始值为 27.82,然后它减少然后增加。同样对于 32.25 / 31 / 32.25 / 31,这里是减少、增加、减少。
  • 嗨,我得到了输出,问题是 5 / 6 /16 / 5 的时间为 5/16/2005,而 2/1/1/1 的时间为 43132。请建议
  • 因为你跳过了空格
  • No 在 R 中输出很好。但是当我导出到 excel 时。它正在转换为日期
  • 我们能不能把特殊字符改成>而不是/。那我想我们不明白。我说什么
【解决方案2】:

这是一个稍微不同的方法,使用tidyverse

数据

vect <- c('27.82 / 27.82 / 23.65 / 27.82',
          '19.87 / 19.87 / 19.14 / 19.87',
          '32.25 / 32.25 / 31 / 32.25 / 31',
          '79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39')

代码

library(tidyverse)
vect %>% 
  str_split( ' / ') %>% 
  map(~.x[.x!=lag(.x) | is.na(lag(.x))]) %>% 
  map_chr(paste, collapse=' / ')

输出

[1] "27.82 / 23.65 / 27.82"   "19.87 / 19.14 / 19.87"   
[3] "32.25 / 31 / 32.25 / 31" "79.39 / 83.36 / 79.39"

【讨论】:

    【解决方案3】:
    test=c("27.82 / 27.82 / 23.65 / 27.82","19.87 / 19.87 / 19.14 / 19.87","32.25 / 32.25 / 31 / 32.25 / 31","79.39 / 79.39 / 79.39 / 79.39 / 83.36 / 79.39")
    unlist(lapply(strsplit(test," / "),function(x) paste(rle(x)$values,collapse=" / ")))
    

    基本上我在test 中构建了您的价格向量。这里发生了什么:

    1. 我使用 strsplit 将 1 列向量的每一行分成各个部分。
    2. 对于这些元素中的每一个,我使用rle 检查重复的连续元素(如Unix uniq),它会生成一个列表,其中包含一个名为values 的元素,其中存储了uniqed 值。
    3. paste 所有这些值都带有paste,折叠选项用于将分隔符设置为与之前使用的相同。
    4. 由于这已经生成了一个列表,我unlist它来生成一个列。

    输出:

    > unlist(lapply(strsplit(test," / "),function(x) paste(rle(x)$values,collapse=" / ")))
    [1] "27.82 / 23.65 / 27.82"   "19.87 / 19.14 / 19.87"   "32.25 / 31 / 32.25 / 31" "79.39 / 83.36 / 79.39"  
    

    顺便说一句,下次最好为社区提供一个可重现的示例(这样读者就不必自己将数据写入对象),并展示您迄今为止尝试过的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多