0

データ フレームの参照列を使用して 4 時間間隔を作成したいと考えています。次のようなデータフレームがあります。

species<-"ABC"
ind<-rep(1:4,each=24)
hour<-rep(seq(0,23,by=1),4)
depth<-runif(length(ind),1,50)

df<-data.frame(cbind(species,ind,hour,depth))
df$depth<-as.numeric(df$depth)

私が望むのは、新しい列を (元のデータ フレームの情報やディメンションを変更せずに) 作成し、時間列 (参照列) を見て、その値に基づいて 4 時間の時間間隔を与えることです。たとえば、hour 列の値が 0 ~ 3 の場合、新しい列の値は 0 になります。値が 4 から 7 の間の場合、新しい列の値は 4 などになります... Excel では、これに床/天井関数を使用していましたが、R ではまったく同じではありません。また、誰かが元の日付/時刻データを使用してこれについてより簡単な提案をしている場合、それも機能する可能性があります。元のスクリプトでは、関数 as.POSIXct を使用して日付/時刻データを取得し、そこから時間列を取得しました。

私はあなたの助けに感謝します、

4

4 に答える 4

2

時間の列を整数に変換し、整数除算を使用してフロアを取得するのはどうですか? このようなもの

# convert hour to integer (hour is currently a col of factors)
i <- as.numeric(levels(df$hour))[df$hour]

# make new column
df$interval <- (i %/% 4) * 4 
于 2012-12-17T05:29:22.670 に答える
2

ある時点で最終的に実際の日付を探していると思うので、私のコメントを拡張します...

毎時データのサンプル:

set.seed(1)
mydata <- data.frame(species = "ABC",
                     ind = rep(1:4, each=24),
                     depth = runif(96, 1, 50),
                     datetime = seq(ISOdate(2000, 1, 1, 0, 0, 0), 
                                    by = "1 hour", length.out = 96))
list(head(mydata), tail(mydata))
# [[1]]
#   species ind    depth            datetime
# 1     ABC   1 14.00992 2000-01-01 00:00:00
# 2     ABC   1 19.23407 2000-01-01 01:00:00
# 3     ABC   1 29.06981 2000-01-01 02:00:00
# 4     ABC   1 45.50218 2000-01-01 03:00:00
# 5     ABC   1 10.88241 2000-01-01 04:00:00
# 6     ABC   1 45.02109 2000-01-01 05:00:00
# 
# [[2]]
#    species ind     depth            datetime
# 91     ABC   4 12.741841 2000-01-04 18:00:00
# 92     ABC   4  3.887784 2000-01-04 19:00:00
# 93     ABC   4 32.472125 2000-01-04 20:00:00
# 94     ABC   4 43.937191 2000-01-04 21:00:00
# 95     ABC   4 39.166819 2000-01-04 22:00:00
# 96     ABC   4 40.068132 2000-01-04 23:00:00

cutと を使用してそのデータを変換しますformat

mydata <- within(mydata, {
    hourclass <- cut(datetime, "4 hours")             # Find the intervals
    hourfloor <- format(as.POSIXlt(hourclass), "%H")  # Display just the "hour"
})
list(head(mydata), tail(mydata))
# [[1]]
#   species ind    depth            datetime           hourclass hourfloor
# 1     ABC   1 14.00992 2000-01-01 00:00:00 2000-01-01 00:00:00        00
# 2     ABC   1 19.23407 2000-01-01 01:00:00 2000-01-01 00:00:00        00
# 3     ABC   1 29.06981 2000-01-01 02:00:00 2000-01-01 00:00:00        00
# 4     ABC   1 45.50218 2000-01-01 03:00:00 2000-01-01 00:00:00        00
# 5     ABC   1 10.88241 2000-01-01 04:00:00 2000-01-01 04:00:00        04
# 6     ABC   1 45.02109 2000-01-01 05:00:00 2000-01-01 04:00:00        04
# 
# [[2]]
#    species ind     depth            datetime           hourclass hourfloor
# 91     ABC   4 12.741841 2000-01-04 18:00:00 2000-01-04 16:00:00        16
# 92     ABC   4  3.887784 2000-01-04 19:00:00 2000-01-04 16:00:00        16
# 93     ABC   4 32.472125 2000-01-04 20:00:00 2000-01-04 20:00:00        20
# 94     ABC   4 43.937191 2000-01-04 21:00:00 2000-01-04 20:00:00        20
# 95     ABC   4 39.166819 2000-01-04 22:00:00 2000-01-04 20:00:00        20
# 96     ABC   4 40.068132 2000-01-04 23:00:00 2000-01-04 20:00:00        20

within新しい「hourclass」変数は要素であり、新しい「hourfloor」変数は文字ですが、これらはステージ中でも簡単に変更できることに注意してください。

str(mydata)
# 'data.frame':    96 obs. of  6 variables:
#  $ species  : Factor w/ 1 level "ABC": 1 1 1 1 1 1 1 1 1 1 ...
#  $ ind      : int  1 1 1 1 1 1 1 1 1 1 ...
#  $ depth    : num  14 19.2 29.1 45.5 10.9 ...
#  $ datetime : POSIXct, format: "2000-01-01 00:00:00" "2000-01-01 01:00:00" ...
#  $ hourclass: Factor w/ 24 levels "2000-01-01 00:00:00",..: 1 1 1 1 2 2 2 2 3 3 ...
#  $ hourfloor: chr  "00" "00" "00" "00" ...
于 2012-12-17T05:59:04.243 に答える
1

cbindヒント番号1、異なるタイプの列を持つdata.frameを作成するために使用しないでください。すべてが同じタイプに強制されます(この場合は要因)

findIntervalまたはcutここで適切と思われるでしょう。

df <- data.frame(species,ind,hour,depth)
# copy
df2 <- df
df2$fourhour <- c(0,4,8,12,16,20)[findInterval(df$hour, c(0,4,8,12,16,20))]
于 2012-12-17T05:27:38.557 に答える
1

おそらくもっと簡単な方法がありますが、ここで 1 つの試みを示します。

ただし、 data.frameをcbind最初に使用しないようにhourfactorてください。numeric

df <- data.frame(species,ind,hour,depth)

それで:

df$interval <- factor(findInterval(df$hour,seq(0,23,4)),labels=seq(0,23,4))

結果:

> head(df)
  species ind hour    depth interval
1     ABC   1    0 23.11215        0
2     ABC   1    1 10.63896        0
3     ABC   1    2 18.67615        0
4     ABC   1    3 28.01860        0
5     ABC   1    4 38.25594        4
6     ABC   1    5 30.51363        4

次のように、ラベルを少し良くすることもできます。

cutseq <- seq(0,23,4)
df$interval <- factor(
                       findInterval(df$hour,cutseq),
                       labels=paste(cutseq,cutseq+3,sep="-")
                     )

結果:

> head(df)
  species ind hour    depth interval
1     ABC   1    0 23.11215      0-3
2     ABC   1    1 10.63896      0-3
3     ABC   1    2 18.67615      0-3
4     ABC   1    3 28.01860      0-3
5     ABC   1    4 38.25594      4-7
6     ABC   1    5 30.51363      4-7
于 2012-12-17T05:27:59.630 に答える