簡體   English   中英

從data.frame列中提取單詞

[英]Extract words from a column of data.frame

在我的數據中,有一列像:

df <- data.frame(status = c("GET/sfuksd1567","GET/sjsh787","POST/hsfhuks","GET/sfukfiezd17","POST/fshks"), stringsAsFactors = FALSE)

我想自動創建另一列,它是變量狀態的指示器,並且它僅提取“ GET”或“ POST”,例如df$ind=c("GET","GET","POST","GET","POST")

我已經嘗試過函數substr ,但是沒有成功。

原始數據:

> df
           status
1  GET/sfuksd1567
2     GET/sjsh787
3    POST/hsfhuks
4 GET/sfukfiezd17
5      POST/fshks

預期結果:

> df
           status  ind
1  GET/sfuksd1567  GET
2     GET/sjsh787  GET
3    POST/hsfhuks POST
4 GET/sfukfiezd17  GET
5      POST/fshks POST

您可以使用正則表達式簡單地刪除反斜杠后的所有內容

df$ind <- sub("/.*", "", df$status)
df
#            status  ind
# 1  GET/sfuksd1567  GET
# 2     GET/sjsh787  GET
# 3    POST/hsfhuks POST
# 4 GET/sfukfiezd17  GET
# 5      POST/fshks POST

或者,如果您不喜歡正則表達式,可以嘗試

library(tidyr)
separate(df, "status", c("ind", "status"))

要么

library(data.table) ## V1.9.6+
setDT(df)[, tstrsplit(status, "/")]

要么

read.table(text = df$status, sep = "/")

最后三個選項只是將status列分為兩個單獨的列。

我們有 :

df<-data.frame(status=c("GET/sfuksd1567","GET/sjsh787","POST/hsfhuks","GET/sfukfiezd17","POST/fshks"),stringsAsFactors=F)

你可以做:

df$ind<-sapply(1:nrow(df),function(x){strsplit(df$status,'/')[[x]][1]})

要么

df$ind<-sapply(strsplit(df$status,'/'),`[[`,1)

都回來了

df
           status  ind
1  GET/sfuksd1567  GET
2     GET/sjsh787  GET
3    POST/hsfhuks POST
4 GET/sfukfiezd17  GET
5      POST/fshks POST

基准測試:

microbenchmark(david=sub("/.*", "", df$status),etienne=sapply(strsplit(df$status,'/'),`[[`,1))

Unit: microseconds
    expr    min      lq     mean  median     uq     max neval cld
   david 25.198 25.8985 27.64456 26.5980 27.298 116.189   100  a 
 etienne 62.294 63.3440 65.13979 63.8695 65.094 128.088   100   b

我們可以使用stri_extract_first_wordslibrary(stringi)

library(stringi)
stri_extract_first_words(df$status)
#[1] "GET"  "GET"  "POST" "GET"  "POST"

tidyr另一個選擇是extract

extract(df, status, into='ind', '([^/]+)/.*', remove=FALSE)

基准測試

使用stri_extract_first_words ,基准是:

david <- function() sub('/.*', '', df$status)
etienne <- function() sapply(strsplit(df$status,'/'),`[[`,1)
akrun <- function()stri_extract_first_words(df$status)
df <-  df[sample(1:nrow(df), 1e6, replace=TRUE),, drop=FALSE]
library(microbenchmark)
microbenchmark(david(), etienne(), akrun(), unit='relative', times=20L)
#Unit: relative
#      expr      min       lq     mean   median       uq      max neval
#   david() 1.826192 1.824263 1.781562 1.814156 1.788085 1.699008    20
# etienne() 4.935629 5.159218 5.136180 5.198875 5.137107 5.930806    20
#   akrun() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000    20

注意:@David Arenburg的帖子中還有其他選項。 我猜sub版本會更快。 我可能是錯的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM