【问题标题】:R: Creating a dataframe from an irregular vectorR:从不规则向量创建数据框
【发布时间】:2017-10-05 00:47:47
【问题描述】:

我正在寻找从网页上抓取的不规则信息向量,并将其转换为数据框。

例如,给定一个看起来像这样的向量:

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

【问题讨论】:

  • 你能指出函数“tibble”来自哪个包吗?
  • @guscht 来自tidyversetibble
  • @guscht Tibbles 是 Hadley Wickham 的 Tidyverse 中的一个对象,你可以在这里阅读 Wickham 的解释:R for Data Science

标签: r


【解决方案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%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多