2017-01-29 4 views
-1

処理を高速化しようとしているため、毎回手動で年を編集する必要はありません。私は確かにRの専門家ではない、これはあまりにも簡単に聞くことができるかどうかは分かりません。結果が正しいので、ベクトルの最初の項目ではうまくいくようです。Rベクトル内の項目を使用してループ内のデータをフィルタリングする

フィルタリングされたデータセットの行の量を毎年印刷したいとします。 ライブラリ(dplyrは)

getData <- function(){ 
    data <- read.csv("data.csv", stringsAsFactors=FALSE) 
} 

data <- getData() 
years <- c("2010", "2011", "2012", "2013", "2014", "2015", "2016") 
nbh <- "SomeVar" 

for(year in years){ 
    data <- filter(data, grepl(year, Created.Date) & grepl(nbh, SomeColumn)) 
    print(nrow(data)) 
} 

しかし、それだけで最初のものが正しいところ、これを出力:

[1] 2 
[1] 0 
[1] 0 
[1] 0 
[1] 0 
[1] 0 
[1] 0 

は、それがデータを最初にフィルタリングするので、それはそれから2つだけレコードを持っている。これは、これは次のものが0になる原因になりますか?

+2

これは、あなたのデータがどのように見えるのかわからなくても解答しにくいでしょう。 [再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を提供できますか? – BLT

+0

@BLTこれはデータそのものとは関係ありませんが、データそのもののループやフィルタリングについて詳しくは分かりません。これは、使用されるすべてのデータセットに適用されます。残念ながら、私はデータを共有することは許可されていません – dnsko

+1

@dnsko、私は私の会社のデータのいずれかを共有することは許可されていません。しかし、あなたと同じ種類の情報を持っているが、独自のものではない偽のデータセットを作成することができます。私はこの質問のために何をしたかを見てください:http://stackoverflow.com/questions/40855554/count-people-present-within-specified-date-range – jesstme

答えて

1

forループでデータセットを上書きしています。試してみてください

for(year in years){ 
    data_temp <- filter(data, grepl(year, Created.Date) & grepl(nbh, SomeColumn)) 
    print(nrow(data_temp)) 
} 
+0

確かに..最初のものが良かったので何かが間違っていなければならないと思った。ありがとう! – dnsko

2

あなたの請求書に合わせてこれを変更できます。

library(dplyr) 

xy <- data.frame(letters = sample(letters, 100, replace = TRUE), 
       years = sample(seq(from = 2010, to = 2015, by = 1), size = 100, replace = TRUE), 
       values = rnorm(100)) 

xy %>% 
    group_by(years) %>% 
    filter(letters %in% c("a", "b", "c")) %>% 
    count() 

# A tibble: 6 × 2 
    years  n 
    <dbl> <int> 
1 2010  5 
2 2011  2 
3 2012  3 
4 2013  1 
5 2014  1 
6 2015  3 
関連する問題