2017-07-20 30 views
0

我有一列由一個DF,結構是這樣的:提取了一些在特定行的數據幀的字符串

 V 
I-232 0 CAT 
G-435 1 DOG 
X-212 AIR 

我想創建一個新的DF這樣做:

N V 
    0 CAT 
    1 DOG 

所以,我想只提取其含有0或1和後他們的文本那些行中,創建新的DF(2列),由這些指數(0/1)進行的第一和記者在其他colu上的下面的話MN。

我該怎麼辦?

回答

0
V <- c("aaa 0 cat", "bbb 1 dog ", "ccc 2 air") 
df <- data.frame(V) 

> df 
      V 
1 aaa 0 cat 
2 bbb 1 dog 
3 ccc 2 air 

您可以使用dplyr和tidyr包

library(dplyr) 
library(tidyr) 

df2 <- separate(df, V, c("txt", "ind", "txt2"), sep = " ") 
df3 <- filter(df2, ind %in% 0:1) 
df4 <- select(df3, ind, txt2) 

> df4 
    ind txt2 
1 0 CAT 
2 1 DOG 

或用管

df %>% 
    separate(V, c("txt", "ind", "txt2"), sep = " ") %>% 
    filter(ind %in% 0:1) %>% 
    select(-txt) 
+0

這只是一個例子。我的DF是b y 700行,只有一列。 – Silvia

+0

這是行不通的,因爲OP的數據幀只有一列 –

+0

請嘗試使用單列,最後一個字段只能使用2個值,而不是每個值爲3。我不確定如何單獨處理缺少的值。 (好吧,用OP值測試) – Tensibai

0

這裏是grepl答案,strsplit

x <- c("I-232 0 CAT","G-435 1 DOG","X-212 AIR") 

# which elements have " 0 " or " 1 " 
ind <- grepl("[[:space:]](1|0)[[:space:]]", x) 

# split 
res <- strsplit(x[ind], "1[[:space:]]|0[[:space:]]") 

# take last element 
sapply(res, function(x) x[length(x)]) 
+0

您的第一個正則表達式將匹配「balabhabja0測試」實際上是交替匹配'1'或'0'。我認爲你是在''[[:space:]](1 | 0)[[:space:]]''之後「。而且strsplit的正則表達式也可以用'「(1 | 0)[[:space:]]」'簡化。 – Tensibai

+0

是的;固定。謝謝 –

+0

沒有空間分開之前,恐怕像「X-210空氣」會匹配,並不會給出正確的結果。 – Tensibai

3

˚F或替代方案的目的,這裏的與正則表達式的一個版本在基R:

x <- c("I-232 0 CAT","G-435 1 DOG","X-212 AIR") 
my_regex <- "^.* (1|0) (.*)$" 
partial <- regmatches(x, regexec(my_regex, x)) 

df <- as.data.frame(Reduce(rbind, partial[ sapply(partial, length) > 0 ])[,2:3],"") 

,並提供:

> df 
    V1 V2 
1 0 CAT 
2 1 DOG 

我們的想法是,以匹配和使期望的值的組在一個道次與正則表達式"^.* (1|0) (.*)$"其匹配字符串的開頭,直到「空格後跟1或0本身後跟空格」以及任何行尾。在該過程中,它在第一組()中捕獲替代1或0以及第二組中空格之後的剩餘文本。

regmatches輸出如下:

> regmatches(x,regexec(my_regex,x)) 
[[1]] 
[1] "I-232 0 CAT" "0"   "CAT"   

[[2]] 
[1] "G-435 1 DOG" "1"   "DOG"   

[[3]] 
character(0) 

所以我們過濾這個結果排除與partial[ sapply(partial,length) > 0 ]空行,然後我們問到Reducerbind列表中的每個條目與as.data.frame把它變成一個data.frame(最後的""參數是爲了避免由Reduce引起的行名稱),然後我們將這個data.frame的子集只分配給兩個所需的列(2和3,我們的組作爲regmatches返回匹配的文本作爲第一個條目)