/ / R: Tworzenie ramki danych z nieregularnego wektora - r

R: Tworzenie ramki danych z nieregularnego wektora - r

Zamierzam wziąć nieregularny wektor informacji pobranych ze strony internetowej i przekształcić go w ramkę danych.

Na przykład, biorąc pod uwagę wektor, który wygląda następująco:

vec <- c("Bank of America", "6%", "JP Morgan", "5%", "Bank of China", "UBS", "7%")

Chciałbym utworzyć ramkę danych, która wygląda tak:

df <- tibble(bank.name = c("Bank of America", "JP Morgan","Bank of China","UBS"), interest.rate = c(6%, 5%, NA, 7%))

Kolumna z nazwą banku jest łatwa do utworzenia za pomocą wyrażeń regularnych. Ale ja walczę o stworzenie wektora dla stóp procentowych, które stawia NA we właściwym miejscu.

Edycja po przeczytaniu odpowiedzi z @guscht:

@guscht miał świetną wektoryzowaną odpowiedź na to pytanie! Obawiałem się, że będziemy musieli użyć pętli for ...

Przetłumaczyłem też rozwiązanie z @guscht na gramatykę tidyverse i wygląda to tak:

test <- c("Bank of America", "6%", "JP Morgan", "5%", "Bank of China", "UBS", "7%")
df <- tibble(bank = test, rate = lead(test,1))

df %>%
filter(str_detect(bank, "%")== FALSE) %>% #Includes only rows that are banks
mutate(rate = ifelse(str_detect(rate, "%") == TRUE, rate, NA)) # converts non-rate values to NA

Odpowiedzi:

1 dla odpowiedzi № 1

Spróbuj tego?

library(data.table) # using data.table because the syntax is nicer
test <- c("Bank of America", "6%", "JP Morgan", "5%", "Bank of China", "UBS", "7%")
dt <- data.table(bank.name = test, interest.rate = shift(test, n = 1, type = "lead"))
dt <- dt[! grepl("%", bank.name)]
dt[! grepl("%", interest.rate), interest.rate := NA]
dt
#           bank.name interest.rate
# 1:  Bank of America            6%
# 2:        JP Morgan            5%
# 3:    Bank of China            NA
# 4:              UBS            7%