2017-03-21 16 views
1

我正試圖破解一行數據。不幸的是,我所有的跑步都保存爲一長排。用括號打破一行數據

第一個值是ID號。最後是性別。 (無需中間的兩個)

[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]] 

我想學習如何打破行,所以,在支架的每個值分離到自己的細胞,並在括號中不只是作爲一個長行數據的。

我的策略是讓R鍵識別爲「]」或之間的空間打破「] [」

這似乎是一個很簡單的問題,但我stringsplit,替代,其它參數不工作。

請幫忙?我只是有點傾斜/沮喪!

非常感謝

+0

爲什麼你的論點不工作?當你嘗試時會發生什麼?顯示你正在嘗試的代碼,以及你得到的錯誤。 – pak

+0

哇我真的很笨,我只是不得不將數據框更改爲字符串,並且我所有的代碼都能正常工作。感謝您的幫助反正fam! –

回答

0

當我嘗試strsplit,它抱怨的特殊字符[中的字符串中。正確的轉義序列是兩個反斜槓:

s = '[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' 
v0 = c(strsplit(s, "] \\[")) 

你會用字符串數組,其中第一串具有完成[在開始和最後一個字符串有]結尾。分別清理這些:

v1 = lapply(v0, function(s) gsub("\\[", "", s)) 
v2 = lapply(v1, function(s) gsub("]", "", s)) 

希望這有助於!

+0

嗯說有錯誤...非字符參數!有任何想法嗎? –

+0

哇我真的很笨,我只是不得不將數據框更改爲字符串,我的所有代碼都能正常工作。感謝您的幫助反正fam! –

0

您可以使用tidyverse,reshapestringr的組合來獲得所需的結果。 separate_rowstidyverse分隔行,即將行分成多行,並且類似地,separatereshape中分出新列。由於最後有兩個右括號,輸出任何輸出,所以我們得到兩行NA值和警告,因此我們使用na.omit()刪除NA值。如果你想只選擇第一個和最後一個欄,您可以使用selectdplyr

library(dplyr) 
library(tidyverse) # for separate_rows 
library(reshape) #for separate to separate columns 
library(stringr) # for string manipulations i.e. remove tralining and leading white spaces 
# data frame from your data 
df_1 <- data.frame(col1='[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' , stringsAsFactors = FALSE) 

# separate rows on closing brackets 
df_2 <- df_1 %>% separate_rows(col1, sep = "]") 

# remove other remaining brackets and leading and triling white space 
df_2["col1"] <- gsub("\\[|\\]", "", str_trim(df_2[["col1"]], "both")) 

# separate the single column data to multiple columns 
df_2 %>% separate(col = col1, into = c("ID", "Num1","Num2", "Gender"), sep = " ") %>% na.omit() %>% select(1,4) 

輸出將是

A tibble: 4 × 2 
    ID Gender 
    <chr> <chr> 
1 131 "male" 
2 123 "female" 
3 232 "male" 
4 132 "male" 
+0

哇謝謝你! 如果我說500行,我怎麼能這樣做呢? –

+0

行數不重要,它應該縮放到任意數量的行。 – discipulus

2

可以使用strsplit和一些整形做這一切一氣呵成:

matrix(strsplit(txt, '[][ "]+')[[1]][-1], ncol=4, byrow=TRUE) 
#  [,1] [,2] [,3] [,4]  
#[1,] "131" "22" "2" "male" 
#[2,] "123" "23" "2" "female" 
#[3,] "232" "21" "2" "male" 
#[4,] "132" "21" "2" "male" 

或通過read.table清理出括號後:

read.table(text=gsub("^\\[\\[|\\] \\[|\\]\\]$", "\n", txt)) 
# V1 V2 V3  V4 
#1 131 22 2 male 
#2 123 23 2 female 
#3 232 21 2 male 
#4 132 21 2 male 

其中txt是:

txt <- '[[131 22 2 "male"] [123 23 2 "female"] [232 21 2 "male"] [132 21 2 "male"]]' 
+0

另一種模式:'「[] [] {2,3}」' – Frank

+0

hmm表示非字符參數...任何想法? –

+0

@usa_josh - 你可能有一個因素不是一個字符向量。只要在分割時使用'as.character(txt)' – thelatemail