我有一列由一個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。
我該怎麼辦?
我有一列由一個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。
我該怎麼辦?
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)
這裏是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)])
˚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 ]
空行,然後我們問到Reduce
的rbind
列表中的每個條目與as.data.frame
把它變成一個data.frame(最後的""
參數是爲了避免由Reduce引起的行名稱),然後我們將這個data.frame的子集只分配給兩個所需的列(2和3,我們的組作爲regmatches返回匹配的文本作爲第一個條目)
這只是一個例子。我的DF是b y 700行,只有一列。 – Silvia
這是行不通的,因爲OP的數據幀只有一列 –
請嘗試使用單列,最後一個字段只能使用2個值,而不是每個值爲3。我不確定如何單獨處理缺少的值。 (好吧,用OP值測試) – Tensibai