2017-04-12 97 views
-1

是否有將數據框拆分爲數字和字母的方法。 例如:我有一個包含以下格式的值柱:將r中的數據幀拆分爲字符和數字

Hamiltion xyx 1324-1562 abc 

我想要的號碼爲單獨的列和數字到不同的列之前採取的數據。 我試過使用gsub()和sub(),但它們返回空。 請幫忙!

+1

將有助於提供所需的輸出的一個例子。 – neilfws

+1

請提供一個小數據框的例子,以及所需的輸出 – user31264

+0

Hi sanjana brid,你有另一個用戶帳戶嗎? http://stackoverflow.com/users/7631583如果是這樣,你可能想要合併這兩者 - 詳情請參閱[本幫助中心頁面](http://stackoverflow.com/help/merging-accounts)。謝謝。 – Pang

回答

0

來自tidyr包的separate函數可能會有用。

# Load package 
library(tidyr) 

# Create example data frame 
dat <- data.frame(Col = "Hamiltion xyx 1324-1562 abc", stringsAsFactors = FALSE) 

# Separate the columns into new columns 
dat %>% 
    separate(Col, into = c("Col1", "Col2", "Col3", "Col4"), sep = " ") 

#  Col1 Col2  Col3 Col4 
# 1 Hamiltion xyx 1324-1562 abc 
2

以下是一些解決方案。我們假設下面Note中的測試data.frame用作輸入。

1)使用read.table分裂空格分開的字段,然後再次read.table但這次sep = "-"分裂第三列。

DF2 <- read.table(text = as.character(DF$x), as.is = TRUE) 
cbind(DF2[-3], read.table(text = DF2$V3, sep = "-", col.names = c("A", "B"))) 

,並提供:

  V1 V2 V4 A B 
1 Hamiltion xyx abc 1324 1562 
2 Hamiltion xyx abc 1324 1562 
3 Hamiltion xyx abc 1324 1562 

在所示列x是一個因素測試data.frame,但如果它是一個字符列,則as.character可能已被忽略,雖然它不會,如果你傷把它留在

2)如果圖案位數字只出現在第3欄則這種替代可以工作:

read.table(text = sub("(\\d)-(\\d)", "\\1 \\2", DF$x), as.is = TRUE) 

給予:

  V1 V2 V3 V4 V5 
1 Hamiltion xyx 1324 1562 abc 
2 Hamiltion xyx 1324 1562 abc 
3 Hamiltion xyx 1324 1562 abc 

3)另一種可能性是使用這種模式給出相同的結果(2)

pat <- "^(\\S+) (\\S+) (\\d+)-(\\d+) (\\S+)$" 
read.table(text = sub(pat, "\\1 \\2 \\3 \\4 \\5", DF$x), as.is = TRUE) 

4)這可以甚至做使用與gsubfn包中的read.pattern(3)相同的圖案更緊湊地使用:

library(gsubfn) 

read.pattern(text = as.character(DF$x), pattern = pat) 

注:

# test data.frame 
DF <- data.frame(x = rep("Hamiltion xyx 1324-1562 abc", 3)) 
相關問題