मेरे पास यह वेक्टर है:
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
फ़ंक्शन के साथ कर सकता था, लेकिन अब मैं नहीं कर सकता। कोई मदद?
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