2016-11-17 25 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 

**