【问题标题】:R: Problems with an "if" conditionR:“如果”条件的问题
【发布时间】:2019-07-12 03:30:24
【问题描述】:

我正在处理以下问题,我有两个向量:

index1<-c(10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21, 22, 23, 24, 25, 26, 27, 28, 29)

index2<-c(17 ,18, 19, 20 ,22 ,23, 24, 25, 26, 27, 28, 29, 30 ,31 ,32, 33 ,42, 43, 44,45, 46 ,47 ,48, 49, 50, 51, 52 ,53, 54 ,55, 56)

我想保留所有可以写为2*index1[i]+k 的组件index2[j],其中k=0,1,2,3。对于一些i in 1:length(index1),j in 1:length(index2)

这是,例如 index2 的第一个组件是 17,这不能写成2*index1[i]+k,所以这个第一个组件应该被删除(或替换为 NA)。 我很难弄清楚如何做到这一点,我试图做一个循环但没有成功。

for(j in 1:length(index2)){
  for(i in 1:length(index1)){
    for(k in 0:3){
if (index2[j]!=(2*index1[i]+k)){index2[j]=NA}else{index2[j]=index2[j]}}}}

在这个特定示例中,所需的输出是一个向量 index2_refined,它包含 index2 的所有组件,但第一个组件除外,即

c( 20 ,22 ,23, 24, 25, 26, 27, 28, 29, 30 ,31 ,32, 33 ,42, 43, 44,45, 46 ,47 ,48, 49, 50, 51, 52 ,53, 54 ,55, 56)

任何帮助将不胜感激。

【问题讨论】:

  • 那么这个特定示例的期望输出是什么,以便可以测试和验证可能的解决方案。
  • 嗨,对不起,18 不能写成 2*index1[i]+k 太正确了?
  • 你说得对,我把事情搞砸了,谢谢指出。

标签: r loops if-statement vector


【解决方案1】:

ok2*index1[i]+k 的所有值组成,因此如果在ok 中找不到index2[j],则将其删除:

ok <- outer(2*index1, 0:3, `+`)
replace(index2, ! (index2 %in% ok), NA)

或者,只保留ok中的元素:

index2[index2 %in% ok]

【讨论】:

    【解决方案2】:

    这是一个没有for() 的想法:

    library(dplyr)
    index1.1 = unique(2*rep(index1,4) + c(rep(1,length(index1)),rep(2,length(index1)),rep(3,length(index1)),rep(4,length(index1))))
    
    index2[index2 %in% index1.1]
    [1] 22 23 24 25 26 27 28 29 30 31 32 33 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    

    另外,正如 Paolo 指出的,根据您的逻辑,应该删除前 4 个元素

    【讨论】:

    • 我明白你的意思,即使额外的术语 k 来自 0:3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多