私は、Webページからスクラップされた不規則な情報ベクトルを取得し、それをデータフレームに変換しようとしています。
たとえば、次のようなベクトルがあるとします。
vec <- c("Bank of America", "6%", "JP Morgan", "5%", "Bank of China", "UBS", "7%")
私はこのようなデータフレームを作成したいと思います:
df <- tibble(bank.name = c("Bank of America", "JP Morgan","Bank of China","UBS"), interest.rate = c(6%, 5%, NA, 7%))
銀行名列は、正規表現を使用して簡単に作成できます。しかし、私はNAを適切な場所に置く金利のためのベクトルを作成するのに苦労しています。
@guschtからの解答を読んだ後の編集:
@guschtには、この質問のためのベクトル化された素晴らしい答えがありました!私は "forループを使用する必要があることを心配していた...
また、@ guschtからtidyverseの文法に解を翻訳しました。これは次のようになります。
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
回答:
回答№1は1これを試して?
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%