2016-07-13 6 views
0

おそらくこの質問が尋ねられましたが、データのパターンのために確かな答えが見つからないことがあります。うまくいけば簡単に答えることができます。私は次のようになり、列があるポーリングデータがあります。セルから番号を抽出するR

Sample 
1000 RV 
456 LV 
678 A 

私は手紙を離陸したいが、それはこのようになりますように、一つのセルと他の中の数字でそれらを置く:

Sample Type 
1000  RV 
456  LV 
678  A 

セルごとに行かないとどうすればいいですか?

+2

を使用することができますsub

df1$Type <- sub("\\d+", "", df1$Sample) df1$Type #[1] "ABC" "CBA" "ETC" 

を使用することができます 'tidyr ::別々の(DFをい、サンプルは、= c( "Sample"、 "Type")、sep = "") 'work? – Psidom

+1

これはまた本質的に 'read.table(text = dat $ Sample)'です。 – thelatemail

+0

@Psidomは完全に動作します。 –

答えて

1

これを達成する方法はたくさんあります。

  1. gsub

    sample <- c("123ABC", "234CBA", "999ETC") 
    
    a <- gsub("[[:digit:]]","",sample) 
    b <- gsub("[^[:digit:]]", "", my.data) 
    
  2. stringr

    library(stringr) 
    a <- as.numeric(str_extract(sample, "[0-9]+")) 
    b <- str_extract(my.data, "[aA-zZ]+") 
    
  3. Psidomコメントに言及している方法(私はそれをテストしていないが、私は彼を信頼して)

+1

@Psidomで#3を使用しました。非常に簡単で簡単です。両方のお手伝いをありがとう。 –

0

この例では、数値Sample列と文字Type列のdata.frameが得られます。他の人が触れたように、これを達成する方法はたくさんあります。

sample <- c('1000  RV', 
      '456  LV', 
      '678  A') 

A <- strsplit(sample, '\\s+')    # Split by whitespace. Returns a list 
B <- unlist(A)        # Converts 1:3 list to a 6x1 character vector 
C <- matrix(B, ncol = 2, byrow = T)   # Convert 6x1 character vector to 3x2 matrix 
D <- as.data.frame(C, stringsAsFactors = F) # Convert matrix to data.frame so columns can be different types 

# All together... 
D <- as.data.frame(matrix(unlist(strsplit(sample, '\\s+')), ncol = 2, byrow = T), 
        stringsAsFactors = F) 

D[ ,1] <- as.numeric(D[ ,1])   # Convert first column to numeric, second remains character 
colnames(D) <- c('Sample', 'Type') # Add column names 

> D 
    Sample Type 
1 1000 RV 
2 456 LV 
3 678 A 
> str(D) 
'data.frame': 3 obs. of 2 variables: 
$ Sample: num 1000 456 678 
$ Type : chr "RV" "LV" "A" 
0

私たちは二つの列としてそれを必要とする場合は、data.tableからtstrsplit

library(data.table) 
setDT(df1)[, setNames(tstrsplit(Sample, "\\s+"), c("Sample", "Type"))] 
関連する問題