Bagaimana cara menggunakan apply untuk mengubah elemen satu kerangka data berdasarkan kolom lain?

Saya memiliki bingkai data di mana dua kolom menandai awal dan akhir wilayah yang perlu saya manipulasi di bingkai data lain. Daripada menerapkan for, saya memutuskan untuk membuat vektor logis dengan baris yang saya minati

df <- data.frame(b=c(7,25,32,44),e=c(11,27,39,48),n=c('a','b','c','d'))
logint <- rep(F,50)

log_vec <-  apply(df[,c('b','e')],1, function(x){logint[x['b']:x['e']] <- T;return(logint)})

Namun, hasilnya berupa matriks dengan satu kolom untuk setiap baris df. Saya tahu saya bisa menyelesaikan ini dengan

log_vec <- Reduce(`|`,as.data.frame(log_vec))

tetapi jika jumlah baris dalam df terlalu besar, memori tidak cukup untuk mengalokasikan matriks hasil penerapan.

Apakah Anda memiliki solusi yang lebih baik?

Terima kasih!


person RMelo    schedule 27.02.2020    source sumber


Jawaban (2)


Kita dapat menggunakan mapply/Map untuk membuat urutan antara nilai b dan e dan mengubahnya menjadi TRUE.

logint <- rep(FALSE,50)
logint[unlist(Map(`:`, df$b, df$e))] <- TRUE
person Ronak Shah    schedule 27.02.2020

Kita juga dapat melakukan ini dengan map2

library(dplyr)
library(purrr)
df %>% 
   transmute(new = map2(b, e, `:`)) %>%
   pull(new) %>% 
   flatten_int %>%
   replace(logint, ., TRUE)
person akrun    schedule 27.02.2020