【问题标题】:How to extract the specific information in the column from the data frame in r?如何从r中的数据框中提取列中的特定信息?
【发布时间】:2017-05-08 03:39:58
【问题描述】:
Fruits
john bought banana and kept 7 days from 15 apr 2015
marker bought apple and kept 10 days from 11 jan 2015
shannon bought apple, banana and kept 12 days from 11 feb 2015
mckinsey bought banana and kept 19 days from 11 dec 2015
george bought banana and kept 17 days from 11 feb 2015
mesa bought banana and kept 10 days from 11 jan 2015
mac bought banana and kept 7 days from 11 sep 2015
henric didn’t buy the fruit

这是数据框中的列内容。我想提取日期月份年份的信息(例如,2015 年 1 月 11 日)并将其存储在另一列。然后我想提取天数(“19 天)将其存储在同一数据框中的另一列。

到目前为止我已经尝试过了。

date <- gsub("[^0-9]", " ", dataframe$fruits)# wrong

但代码似乎不正确。 谁能帮帮我? 提前致谢。

【问题讨论】:

  • 那么你的data.frame包含8行1列(Fruits),每个值都是一串字符?

标签: r


【解决方案1】:

我们可以使用 str_extract 创建“日期”(通过匹配 2 个数字 ([0-9]{2}) 后跟一个或多个空格 (\\s+) 后跟三个字母 ([A-z]{3}) 后跟 4数字 ([0-9]{4}) 在字符串的末尾 ($) 和“天”(一个或多个数字 (\\d+) 后跟零个或多个空格 (\\s*) 后跟“天”字符串)

library(stringr)
df1$Date <- str_extract(df1$Fruits, "[0-9]{2}\\s+[A-z]{3}\\s+[0-9]{4}$")
df1$Days <- str_extract(df1$Fruits, "\\d+\\s*days")
df1
                                                          #Fruits        Date    Days
#1            john bought banana and kept 7 days from 15 apr 2015 15 apr 2015  7 days
#2          marker bought apple and kept 10 days from 11 jan 2015 11 jan 2015 10 days
#3 shannon bought apple, banana and kept 12 days from 11 feb 2015 11 feb 2015 12 days
#4       mckinsey bought banana and kept 19 days from 11 dec 2015 11 dec 2015 19 days
#5         george bought banana and kept 17 days from 11 feb 2015 11 feb 2015 17 days
#6           mesa bought banana and kept 10 days from 11 jan 2015 11 jan 2015 10 days
#7             mac bought banana and kept 7 days from 11 sep 2015 11 sep 2015  7 days
#8                                    henric didn’t buy the fruit        <NA>    <NA>

数据

 df1 <- structure(list(Fruits = c("john bought banana and kept 7 days from 15 apr 2015", 
"marker bought apple and kept 10 days from 11 jan 2015", "shannon bought apple, banana and kept 12 days from 11 feb 2015", 
"mckinsey bought banana and kept 19 days from 11 dec 2015", "george bought banana and kept 17 days from 11 feb 2015", 
"mesa bought banana and kept 10 days from 11 jan 2015", "mac bought banana and kept 7 days from 11 sep 2015", 
"henric didn’t buy the fruit")), .Names = "Fruits", class = "data.frame", row.names = c(NA, 
-8L))

【讨论】:

  • @Raj 如果你不明白这里的正则表达式是如何工作的,我建议你尝试一个像 regex101 这样的正则表达式测试站点——它在 this answer 上做得很好
  • @Raj 我用“数据”创建了一个可重现的示例。它对我有用。请检查str(yourdata) 是否为matrix。如果是matrix,则使用df1[,1]
  • 同样,如果它不能使用@akrun 必须创建的数据来模拟从您的问题中推断出的内容,那么提供reproducible question 对您来说将是有益的,包括足够的数据子集,以便能够准确地复制它。
【解决方案2】:

您可以使用strsplit 将所有内容分开,然后重新组合:

df <- read.csv2(text = 'Fruits
john bought banana and kept 7 days from 15 apr 2015
marker bought apple and kept 10 days from 11 jan 2015
shannon bought apple, banana and kept 12 days from 11 feb 2015
mckinsey bought banana and kept 19 days from 11 dec 2015
george bought banana and kept 17 days from 11 feb 2015
mesa bought banana and kept 10 days from 11 jan 2015
mac bought banana and kept 7 days from 11 sep 2015
henric didn’t buy the fruit')

split_text <- strsplit(as.character(df$Fruits), ' bought | and kept | days from ')

df2 <- data.frame(do.call(rbind, split_text[lengths(split_text) == 4]), stringsAsFactors = FALSE)
names(df2) <- c('name', 'fruit', 'days', 'date')

df2$days <- as.integer(df2$days)
df2$date <- as.Date(df2$date, '%d %b %Y')

df2
#>       name         fruit days       date
#> 1     john        banana    7 2015-04-15
#> 2   marker         apple   10 2015-01-11
#> 3  shannon apple, banana   12 2015-02-11
#> 4 mckinsey        banana   19 2015-12-11
#> 5   george        banana   17 2015-02-11
#> 6     mesa        banana   10 2015-01-11
#> 7      mac        banana    7 2015-09-11

请注意,您必须对最后一个观察结果进行子集化,因为它与模式不对应。

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2020-10-30
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2022-12-18
    • 2020-10-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多