1

次のようなデータフレームがあります。

species<-"ABC"
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
month<-rep(seq(1,12),8)
depth<-runif(length(ind),1,50)
df<-data.frame(species,ind,month,hour,depth)

私が望むのは、列月を使用して各季節の間隔を指定し、同じデータフレームから新しい列にそれらの値を返すことです。私はこのコードを季節に使用していましたが、これはうまく機能しているようですが、

# Classify months into seasons

summer<-c(1,2,12)
fall<-c(3,4,5)
winter<-c(6,7,8)
spring<-c(9,10,11)

# Create a new column with seasons

df$season<-NA
for(i in 1:nrow(df)){
  if(df$month[i]%in%summer){df$season[i]<-"1-summer"} else
    if(df$month[i]%in%fall){df$season[i]<-"2-fall"} else
      if(df$month[i]%in%winter){df$season[i]<-"3-winter"} else
        if(df$month[i]%in%spring){df$season[i]<-"spring"} 

}

ただし、このループは、より複雑でより大きなデータベースを備えたより大きなループの内部にすでにあります。だから私はより速く、より効率的なアプローチを探していました。元のデータフレームを切り取ったりサブセット化したりするのではなく、ループを使用している理由は、使用している最初のループが個々の動物を分離して分析を実行しているためです。結果のデータフレームの長さは動物によって異なり、私が抱えていた問題の1つは、すべての動物がすべての月に存在するわけではないことです。そのため、特定の季節に存在しなかった動物にループ内の季節を割り当てようとしたとき、それからRは私にエラーメッセージを与えました...

4

2 に答える 2

2
seasons <- c("1-summer", "2-fall", "3-winter", "spring")
df$season2 <- factor(trunc(df$month %% 12 / 3) + 1, labels = seasons)
table(df$season, df$season2)

df$season2必要に応じて変換できcharacterます。

于 2012-12-19T12:06:07.510 に答える
1

季節名のルックアップ テーブルを生成し、それを適用します。

> season.names <- rep("",12)
> season.names[summer] <- "1-summer"
> season.names[fall] <- "2-fall"
> season.names[winter] <- "3-winter"
> season.names[spring] <- "4-spring"
> season.names
 [1] "1-summer" "1-summer" "2-fall"   "2-fall"   "2-fall"   "3-winter" "3-winter"
 [8] "3-winter" "4-spring" "4-spring" "4-spring" "1-summer"
> df$season <- season.names[df$month]
> head(df)
  species ind month hour     depth   season
1     ABC   1     1    0 41.643471 1-summer
2     ABC   1     2    1 36.055533 1-summer
3     ABC   1     3    2  1.901639   2-fall
4     ABC   1     4    3  7.737539   2-fall
5     ABC   1     5    4 35.327364   2-fall
6     ABC   1     6    5  9.156978 3-winter
于 2012-12-19T13:00:43.627 に答える