मेरे पास यह वेक्टर है:

vector_1 <- c("2020-01-10", "2020-01-11", "2020-01-12", NA, NA, "2020-01-14", NA, NA, NA, "2020-01-17", NA)

मैं जो चाहता हूं वह इस तरह से डेटाफ्रेम प्राप्त करना है:

vector_1        vector_2
"2020-01-10"           1
"2020-01-11"           2
"2020-01-12"           3
NA                    NA
NA                    NA
"2020-01-14"           4
NA                    NA
NA                    NA
NA                    NA
"2020-01-17"           5
NA                    NA

अगर vector_1 में कोई NA नहीं होता तो मैं इसे cumsum फ़ंक्शन के साथ कर सकता था, लेकिन अब मैं नहीं कर सकता। कोई मदद?

r
0
Alex 22 अक्टूबर 2020, 12:18

4 जवाब

सबसे बढ़िया उत्तर
tmp <- cumsum(!is.na(vector_1))
data.frame(
  vector_1, vector_2 = replace(tmp, duplicated(tmp), NA)
)
#      vector_1 vector_2
# 1  2020-01-10        1
# 2  2020-01-11        2
# 3  2020-01-12        3
# 4        <NA>       NA
# 5        <NA>       NA
# 6  2020-01-14        4
# 7        <NA>       NA
# 8        <NA>       NA
# 9        <NA>       NA
# 10 2020-01-17        5
# 11       <NA>       NA

या magrittr के साथ वन-लाइनर:

library(magrittr)
data.frame(vector_1, vector_2 = is.na(vector_1) %>% replace(cumsum(!.), ., NA))
1
sindri_baldur 22 अक्टूबर 2020, 12:22

क्या यह काम करता है

> library(dplyr)
> vector_1 <- c("2020-01-10", "2020-01-11", "2020-01-12", NA, NA, "2020-01-14", NA, NA, NA, "2020-01-17", NA)
> df <- data.frame(vector_1 = vector_1)
> df %>% left_join(df %>% filter(!is.na(vector_1)) %>% mutate(vector_2 = row_number()))
Joining, by = "vector_1"
     vector_1 vector_2
1  2020-01-10        1
2  2020-01-11        2
3  2020-01-12        3
4        <NA>       NA
5        <NA>       NA
6  2020-01-14        4
7        <NA>       NA
8        <NA>       NA
9        <NA>       NA
10 2020-01-17        5
11       <NA>       NA
> 
0
Karthik S 22 अक्टूबर 2020, 12:20

आप अभी भी cumsum का उपयोग कर सकते हैं और NA को NA से फिर से बदल सकते हैं:

transform(data.frame(vector_1 = vector_1, 
                     vector_2 = cumsum(!is.na(vector_1))), 
          vector_2 = replace(vector_2, is.na(vector_1), NA))

#     vector_1 vector_2
#1  2020-01-10        1
#2  2020-01-11        2
#3  2020-01-12        3
#4        <NA>       NA
#5        <NA>       NA
#6  2020-01-14        4
#7        <NA>       NA
#8        <NA>       NA
#9        <NA>       NA
#10 2020-01-17        5
#11       <NA>       NA
0
Ronak Shah 22 अक्टूबर 2020, 12:21

यहाँ cumsum के बिना एक और आसान तरीका है:

vector_2 <- rep(NA_real_, length(vector_1))
vector_2[!is.na(vector_1)] <- seq_along(vector_1[!is.na(vector_1)])
0
Cettt 22 अक्टूबर 2020, 12:24