तो मेरे पास निम्न प्रकार का डेटासेट है। मेरे पास तीन क्षेत्र हैं, और प्रत्येक क्षेत्र में ठीक एक तारीख को बारिश और ओलावृष्टि हुई थी,

area<-c("A","B","C")
rain<-c("1994/08/01","1994/08/01","1994/08/03")
hail<-c("1994/08/03","1994/08/04","1994/08/05")

data1<-as.data.frame(cbind(area,rain,hail))

data1

आउटपुट कुछ इस तरह दिखता है:

मेरे पास डेटा का प्रकार

enter image description here

जो कुछ इस तरह दिखता है:

+-------+------------+------------+--+--+
|       |            |            |  |  |
+-------+------------+------------+--+--+
| area  | rain       | hail       |  |  |
| A     | 1994/08/01 | 1994/08/03 |  |  |
| B     | 1994/08/01 | 1994/08/04 |  |  |
| C     | 1994/08/03 | 1994/08/05 |  |  |
+-------+------------+------------+--+--+

मैं इसे प्रति क्षेत्र एक समय श्रृंखला में बदलना चाहता हूं। लंबे डेटा की तरह क्रमबद्ध करें:

date<-as.Date(c("1994/08/01","1994/08/02","1994/08/03","1994/08/04","1994/08/05"))
date<-c(date,date,date)
area<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C")

rain<-c(1,0,0,0,0,1,0,0,0,0,0,0,1,0,0)
hail<-c(0,0,1,0,0,0,0,0,1,0,0,0,0,0,1)
data2<-as.data.frame(date)
data2<-cbind(data2,area,rain,hail)
data2

मुझे जिस तरह का डेटा चाहिए

enter image description here

या ऐसा कुछ:

------------+------+-------+------+--+
|    date    | area | rain  | hail |  |
+------------+------+-------+------+--+
| 1994-08-01 | A    |     1 |    0 |  |
| 1994-08-02 | A    |     0 |    0 |  |
| 1994-08-03 | A    |     0 |    1 |  |
| 1994-08-04 | A    |     0 |    0 |  |
| 1994-08-05 | A    |     0 |    0 |  |
| 1994-08-01 | B    |     1 |    0 |  |
| 1994-08-02 | B    |     0 |    0 |  |
| 1994-08-03 | B    |     0 |    0 |  |
| 1994-08-04 | B    |     0 |    1 |  |
| 1994-08-05 | B    |     0 |    0 |  |
+------------+------+-------+------+--+

यह बेहद अपरंपरागत है और मुझे यकीन है कि ऐसा कोई DPLYR पैकेज नहीं है जो ऐसा करता है लेकिन किसी भी सहायता की बहुत सराहना की जाती है। यदि किसी अन्य विवरण की आवश्यकता है, तो कृपया पूछें।

0
Syed Mohammad Ali Abidi 11 सितंबर 2020, 04:28

3 जवाब

सबसे बढ़िया उत्तर

आप इसे tidyverse फ़ंक्शंस के साथ कर सकते हैं:

library(dplyr)
data1 %>%
  mutate(across(c(rain, hail), lubridate::ymd),
         date = list(seq(min(rain, hail), max(rain, hail), 'day'))) %>%
  tidyr::unnest(date) %>%
  mutate(across(c(rain, hail), ~+(. == date)))

# A tibble: 15 x 4
#   area   rain  hail date      
#   <chr> <int> <int> <date>    
# 1 A         1     0 1994-08-01
# 2 A         0     0 1994-08-02
# 3 A         0     1 1994-08-03
# 4 A         0     0 1994-08-04
# 5 A         0     0 1994-08-05
# 6 B         1     0 1994-08-01
# 7 B         0     0 1994-08-02
# 8 B         0     0 1994-08-03
# 9 B         0     1 1994-08-04
#10 B         0     0 1994-08-05
#11 C         0     0 1994-08-01
#12 C         0     0 1994-08-02
#13 C         1     0 1994-08-03
#14 C         0     0 1994-08-04
#15 C         0     1 1994-08-05

rain और hail दिनांक कॉलम बनाएं, न्यूनतम और अधिकतम तिथि के बीच एक क्रम बनाएं, लंबे रूप में डेटा प्राप्त करें और मौजूद तिथियों के लिए 1/0 मान निर्दिष्ट करें।

0
Ronak Shah 11 सितंबर 2020, 04:37

यदि आप आधार R पसंद करते हैं, और आप आधार कार्यों से R के बारे में अधिक जानना चाहते हैं, तो आप कोशिश कर सकते हैं:

data1[-1] <- lapply(data1[-1], as.Date) # Change the rain and hail columns to date
data2 <- merge(data1, do.call(seq,c(as.list(do.call(range,data1[-1])), by = 1))) #create data2
names(data2)[4] <- "date" # change the name of column y
data2[2:3] <- +sapply(data2[2:3],`==`,data2[,4]) # find the 1, 0
data.frame(data2[order(data2$area),], row.names = NULL) # Just arrange the data


 area rain hail       date
1     A    1    0 1994-08-01
2     A    0    0 1994-08-02
3     A    0    1 1994-08-03
4     A    0    0 1994-08-04
5     A    0    0 1994-08-05
6     B    1    0 1994-08-01
7     B    0    0 1994-08-02
8     B    0    0 1994-08-03
9     B    0    1 1994-08-04
10    B    0    0 1994-08-05
11    C    0    0 1994-08-01
12    C    0    0 1994-08-02
13    C    1    0 1994-08-03
14    C    0    0 1994-08-04
15    C    0    1 1994-08-05
0
Onyambu 11 सितंबर 2020, 05:39