2016-11-17 21 views
0

我有两个if语句的for循环。它一切正常,除了我想添加通过第二个if语句的值传递给变量v1。我首先分配变量,然后变量充满了许多NA和我期待的三个值。但我只想要变量中的那三个值。R - 在两个语句之后将值写入变量

因此,不是只写满足要求的i,而是将每个i写入变量。

v1 <- c() 

for(i in seq_along(y$values)){ 
    if(y$lengths[i] < 500 && y$values[i] == TRUE){ 
    y$values[i] <- FALSE 
    } 
    if(y$lengths[i] > 500 && y$values[i] == TRUE){ 
    print(y$lengths[i]) 
    v1[[i]] <- y$lengths[i] 
    } 
} 

我看看适用的功能,但无法真正弄清楚如何使用这两个如果陈述适用。

该数据是一个大的逻辑向量。我在该矢量上使用y <- rle(vec),这给我y$lengths(1和几十万之间的所有数)和y$values(真和假)。

期望的结果是RLE长度,其中> 500和真实是真实的:

[1] 5120 
[1] 16630 
[1] 10188 

了打印命令给我就好了。

dput(y$length)给我:

c(129719L, 1L, 79337L, 2L, 4L, 1L, 3L, 1L, 2L, 1L, 1L, 1L, 4L, 
2L, 2L, 3L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 5L, 1L, 3L, 1L, 
6L, 1L, 5120L, 1L, 39L, 1L, 12L, 1L, 121L, 1L, 14L, 1L, 6L, 1L, 
3L, 1L, 3L, 1L, 2L, 1L, 6L, 1L, 11L, 1L, 9L, 1L, 10L, 2L, 6L, 
1L, 2L, 2L, 1L, 1L, 7L, 2L, 4L, 1L, 2L, 1L, 4L, 1L, 3L, 2L, 5L, 
1L, 5L, 4L, 8L, 1L, 4L, 1L, 4L, 2L, 2L, 2L, 9L, 1L, 2L, 1L, 2L, 
1L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 3L, 3L, 1L, 
7L, 1L, 1L, 1L, 1L, 2L, 6L, 2L, 2L, 1L, 2L, 4L, 3L, 1L, 1L, 1L, 
4L, 3L, 2L, 1L, 5L, 5L, 2L, 2L, 3L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 
4L, 2L, 2L, 1L, 1L, 1L, 4L, 1L, 1L, 3L, 4L, 2L, 1L, 1L, 13L, 
1L, 3L, 2L, 3L, 1L, 9L, 1L, 1L, 1L, 1L, 2L, 3L, 1L, 4L, 1L, 13L, 
1L, 3L, 1L, 4L, 1L, 8L, 1L, 7L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 3L, 
1L, 4L, 1L, 2L, 2L, 5L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 4L, 3L, 
3L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 3L, 1L, 2L, 1L, 4L, 1L, 9L, 2L, 
6L, 1L, 14L, 1L, 2L, 1L, 6L, 1L, 16630L, 7L, 1L, 3L, 2L, 3L, 
1L, 4L, 3L, 4L, 1L, 1L, 2L, 7L, 1L, 1L, 1L, 1L, 1L, 8L, 1L, 5L, 
1L, 6L, 1L, 1L, 3L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 
1L, 1L, 1L, 6L, 1L, 5L, 1L, 2L, 2L, 3L, 1L, 5L, 2L, 3L, 1L, 2L, 
2L, 10L, 1L, 4L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 7L, 3L, 
1L, 1L, 4L, 1L, 1L, 1L, 10L, 1L, 2L, 2L, 3L, 1L, 3L, 5L, 2L, 
3L, 1L, 1L, 2L, 1L, 1L, 3L, 1L, 4L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 
1L, 4L, 2L, 1L, 1L, 3L, 1L, 1L, 2L, 1L, 4L, 1L, 1L, 3L, 4L, 2L, 
1L, 2L, 1L, 1L, 3L, 1L, 2L, 1L, 2L, 1L, 3L, 1L, 2L, 1L, 3L, 1L, 
1L, 1L, 3L, 2L, 12L, 1L, 3L, 2L, 2L, 1L, 1L, 2L, 7L, 1L, 2L, 
1L, 1L, 2L, 1L, 1L, 7L, 1L, 2L, 1L, 4L, 1L, 7L, 1L, 4L, 1L, 1L, 
1L, 6L, 1L, 6L, 1L, 6L, 2L, 14L, 1L, 5L, 1L, 9L, 1L, 1L, 1L, 
1L, 2L, 39L, 1L, 20L, 1L, 1L, 1L, 6L, 1L, 9L, 2L, 5L, 1L, 7L, 
1L, 16L, 1L, 22L, 1L, 1L, 1L, 10L, 1L, 20L, 1L, 18L, 1L, 20L, 
1L, 3L, 1L, 2L, 1L, 2L, 1L, 5L, 1L, 9L, 1L, 3L, 1L, 3L, 1L, 15L, 
1L, 10L, 1L, 40L, 1L, 30L, 1L, 111L, 1L, 314L, 1L, 9L, 1L, 10188L, 
4L, 88L, 1L, 8L, 1L, 1L, 1L, 1L, 1L, 15L, 1L, 24L, 1L, 1L, 2L, 
3L, 1L, 16L, 1L, 3L, 1L, 4L, 2L, 2L, 2L, 1L, 2L, 5L, 2L, 2L, 
7L, 1L, 1L, 3L, 2L, 3L, 7L, 2L, 1L, 1L, 6L, 1L, 4L, 2L, 2L, 1L, 
2L, 1L, 1L, 1L, 13L, 1L, 2L, 1L, 2L, 1L, 3L, 1L, 3L, 1L, 4L, 
1L, 16L, 1L, 4071L, 5L, 162912L, 1L, 6L, 1L, 280986L) 
+2

请'输入()'您的数据并包含所需结果的示例 –

+0

仍然与你的问题混淆!你只想要那些大于500的y $长度? –

+2

将'v1 [[i]] < - y $ lengths [i]'改为'v1 < - c(v1,y $ lengths [i])''。或者,更好的'y $长度[y $长度> 500]' – ExperimenteR

回答

1

您可以非常有效地得到最终的V1矢量没有循环或应用这样的:

v1 <- y$lengths[y$lengths > 500 & y$values == TRUE] 

如果你想在这里使用循环有两种选择:

(1)您可以像这样附加到v1:

v1 <- c() 
for(i in seq_along(y$values)){ 
    if(y$lengths[i] < 500 && y$values[i] == TRUE){ 
    y$values[i] <- FALSE 
    } 
    if(y$lengths[i] > 500 && y$values[i] == TRUE){ 
    print(y$lengths[i]) 
    v1 <- c(v1, y$lengths[i]) 
    } 
} 

(2)如果向量v1变得非常长,那么像这样的附加可以变得非常慢。作为替代,你可以预先分配则排除在NAS到底是这样的:

v1 <- rep(NA, length) 
for(i in seq_along(y$values)){ 
    if(y$lengths[i] < 500 && y$values[i] == TRUE){ 
    y$values[i] <- FALSE 
    } 
    if(y$lengths[i] > 500 && y$values[i] == TRUE){ 
    print(y$lengths[i]) 
    v1[i] <- y$lengths[i] 
    } 
} 
v1 <- v1[!is.na(v1)] 
+0

没有循环的版本非常好! – BallerNacken

0

这似乎与我通过阅读你的问题推断样本数据的工作:

y<-data.frame(lengths=seq(100,900,100), 
       values=c("TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE", "FALSE", "TRUE")) 
v1 <- c() 

for(i in seq_along(y$values)){ 
    if(y$lengths[i] < 500 && y$values[i] == TRUE){ 
y$values[i] <- FALSE 
    } 
    if(y$lengths[i] > 500 && y$values[i] == TRUE){ 
#print(y$lengths[i]) 
ifelse(length(v1)>0, v1<-rbind(v1, y$lengths[i]), v1<-y$lengths[i]) 
#v1 <- rbind(y$lengths[i]) 
    } 
} 

**

> v1 
    [,1] 
v1 700 
    900 

**