私は次の種類のデータを持っています:
group<-as.character(c("A","A","A","A","B","B","B","B"))
rain_start<-c(1,0,0,0,0,1,0,0)
rain_end<-c(0,0,1,0,0,1,0,0)
day<-c(1,2,3,4,1,2,3,4)
data<-as.data.frame(cbind(group,rain_start,rain_end,day))
これは以下を生成します:
+--------+-------------+-----------+-----+--+
| | | | | |
+--------+-------------+-----------+-----+--+
| group | rain_start | rain_end | day | |
| A | 1 | 0 | 1 | |
| A | 0 | 0 | 2 | |
| A | 0 | 1 | 3 | |
| A | 0 | 0 | 4 | |
| B | 0 | 0 | 1 | |
| B | 1 | 0 | 2 | |
| B | 0 | 1 | 3 | |
| B | 0 | 0 | 4 | |
+--------+-------------+-----------+-----+--+
ここで、グループごとに、雨が降っていたかどうかを示す1つの列を作成したいと思います。そう:
rain<-c(1,1,1,0,1,1,0,0)
data2<-as.data.frame(cbind(group,rain,day))
data2
これは以下を生成します:
+-------+------+------+--+--+
| group | rain | day | | |
+-------+------+------+--+--+
| A | 1 | 1 | | |
| A | 1 | 2 | | |
| A | 1 | 3 | | |
| A | 0 | 4 | | |
| B | 1 | 1 | | |
| B | 1 | 2 | | |
| B | 0 | 3 | | |
| B | 0 | 4 | | |
+-------+------+------+--+--+
dplyrでmutate()とifelseを試しましたが、ベクトルの不一致に問題があります。
rain_start
グループBの1日目から開始すると仮定すると、次のように実行できます。
library(dplyr)
data %>%
group_by(group) %>%
mutate(rain = as.integer(between(row_number(),
match(1, rain_start), match(1, rain_end)))) %>%
select(group, rain, day)
# group rain day
# <chr> <int> <dbl>
#1 A 1 1
#2 A 1 2
#3 A 1 3
#4 A 0 4
#5 B 1 1
#6 B 1 2
#7 B 0 3
#8 B 0 4
すべての値を1に変換します。ここで、row_number()
は最初の値whererain_start = 1
と最初の値whereの間にありrain_end = 1
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加