【问题标题】:How to exclude any zero within a vector and values after two consecutive zeros?如何排除向量中的任何零以及两个连续零之后的值?
【发布时间】:2017-05-29 15:07:18
【问题描述】:

有一点我有很多问题:假设我有一个随机的 10x10 矩阵,其列 a 如下所示。我现在要做的是排除a 列中包含零的任何行。此外,必须排除两个连续零之后的任何值,以便b 是我想要的目标向量。

a <- c(13, 7, 2, 0, 4, 3, 0, 0, 5, 8)

b <- c(13, 7, 2, 4, 3)

我已经尝试将diff 函数与不同的lags 一起应用,但到目前为止还没有真正奏效。感谢您的帮助!

第二个例子:d &lt;- c(0, 0, 0, 0, 0.8, 0, 0, 0.4, 0, 0, 0.5, 0.1, 0, 0.1, 0.1)

不应包含前十个元素。也许,我忘了提到我想在第一个连续的两个零之后排除所有值。

【问题讨论】:

  • 在第二个例子中,那么任何元素都不会被包含,对吧,因为开头有4个连续的0?如果它只有 2 个连续的 0,那么在第 5 个元素之后,即。 0.8,有2个连续的0对不起,我很困惑你的first ten elements should not be included
  • 0.8 0.4 0.5 0.1 0.1 0.1 是它吐出来的。只是 0.8/0.4 太多了,它不排除前两个缺点之后的任何值。零(从后面开始)。问题是我必须开始排除在这个向量上向后开始的零,例如,如果你理解我的意思:保持 0.1,跳过零,保持 0.1 和 0.5,仅此而已,因为后面有两个零
  • 正如我在前面的评论中提到的,前 2 个连续的 0 出现在 0.8 之后。你的预期输出是什么
  • 0.5 0.1 0.1 0.1 是我想要的
  • 在你的第二个例子中,不是 0.5 在两个连续的 0 之后,因此应该被删除吗?

标签: r diff


【解决方案1】:

我们可以使用

a[cumsum(a == 0)<2 & a!=0]
#[1] 13  7  2  4  3

获取其他值

a[cumsum(a == 0)>2 & a!=0]
#[1] 5 8

或者另一种选择是

library(data.table)
a1 <- a[seq_len(which((a== 0) & (shift(a, fill =0, type = 'lead')==0))-1)]
b <- a1[a1!=0]
b
#[1] 13  7  2  4  3

【讨论】:

  • @rapuu 更新了帖子
  • 嗯,我将第二个代码应用于我的实际数据,但它仍然包含两个连续零出现“之前”的值。
  • @rapuu 你的意思是a[cumsum(a == 0)&gt;2 &amp; a!=0]。你能用另一个例子更新你的问题来检查吗
  • 完成,抱歉没有正确写入矢量@akrun
【解决方案2】:

如果你想删除每一个 0 以及两个连续 0 之后的所有内容,你可以这样做:将你的向量转换为数字用逗号分隔的字符串,使用正则表达式删除不需要的元素,然后转换回数值向量形式:

## gsub("0\\,|(0\\,){2}.*","",..) removes every 0 and every two zeros followed by anything
a = c(13,7,2,0,4,3,0,0,5,8)
b = as.numeric(unlist(strsplit(gsub("0\\,|(0\\,){2}.*","",paste0(a,collapse=",")),",")))

这会返回:

[1] 13  7  2  4  3

如果您想删除每一个 0 以及两个连续 0 之前的所有内容:

d = c(0, 0, 0, 0, 0.8, 0, 0, 0.4, 0, 0, 0.5, 0.1, 0, 0.1, 0.1)
c = as.numeric(unlist(strsplit(gsub("0\\,|.*(0\\,){2}","",paste0(d,collapse=",")),",")))

这会返回:

[1] 0.5 0.1 0.1 0.1

【讨论】:

  • 使用此代码显示:数字(0),用于我在原始帖子中编辑的第二个示例。 @拉米亚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2021-12-31
  • 2021-07-17
  • 2012-07-28
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多