2009-11-04 79 views
35

串矢量I具有以下矢量:拆分中的R

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1") 

我想只保留在每個該向量的原子的第二數量,所以這將讀:

c(2,1,2,1,2,1,2,1,2,1) 
+0

你能接受答案來標記問題已解決嗎? – MERose 2015-12-29 01:33:34

回答

31

有可能是一個更好的辦法,但這裏有兩種方法與strsplit()

as.numeric(data.frame(strsplit(tmp3, " "))[2,]) 
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2])) 

的as.numer IC()可能不是必要的,如果你能使用的字符...

+0

這是一個優雅的解決方案。正是我在找的東西。謝謝! – Zak 2009-11-05 14:07:21

+0

我試圖使用你的解決方案,而是使用數據框的列,並且它不能馬上工作。我會補充說,對於這些情況,你需要把它變成一個列表。 'as.numeric(data.frame(strsplit(如。list(df $ columnx),「」))[2,])' – pedrosaurio 2013-05-02 18:57:48

5
substr(x = tmp3, start = 6, stop = 6) 

只要你的字符串總是相同的長度,這應該做的伎倆。

(當然,你不必指定參數名 - substr(tmp3, 6, 6)做工精細,太)

21

人們可以使用read.tabletextConnection

X <- read.table(textConnection(tmp3)) 

然後

> str(X) 
'data.frame': 10 obs. of 2 variables: 
$ V1: int 1500 1500 1510 1510 1520 1520 1530 1530 1540 1540 
$ V2: int 2 1 2 1 2 1 2 1 2 1 

所以X$V2是你所需要的。

4

這應做到:

library(plyr) 
ldply(strsplit(tmp3, split = " "))[[2]] 

如果你需要一個數字載體,應用

as.numeric(ldply(strsplit(tmp3, split = " "))[[2]]) 
9

我認爲什麼是最優雅的方式來做到這一點

>  res <- sapply(strsplit(tmp3, " "), "[[", 2) 

如果你需要它是一個整數

>  storage.mode(res) <- "integer" 
+0

另外,'res < - as.numeric(sapply(...))'也適用; 'storage.mode'有點可怕 – user295691 2013-04-30 20:02:55

-1

更簡單的方法來通過data.table

require(data.table) 
data_ex = data.table(a = paste(sample(1:3, size=10, replace=TRUE),"-separate", sep="")) 
data_ex[, number:= unlist(strsplit(x=a, split="-"))[[1]], by=a] 
data_ex[, word:= unlist(strsplit(x=a, split="-"))[[2]], by=a ] 
8

1列分成兩列這取決於你的實際數據是如何密切你給出的示例數據匹配一點點。我你只是試圖讓空間之後的一切,你可以使用gsub

gsub(".+\\s+", "", tmp3) 
[1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1" 

如果你想實現一個規則比「乘坐空間後,一切」更復雜,你需要一個更復雜的正規表達。

+0

你能解釋一下嗎...... – user3067923 2016-11-17 19:56:59

+0

'gsub'函數是用來替換正則表達式匹配的東西。在這種情況下,我們使用正則表達式'。+ \\ s +'並用空字符串''「'替換我們找到的任何匹配項。正則表達式轉換爲「在一開始就匹配任何東西,但它必須以一個空格結束」(字符空間寫爲\\ s') – 2017-09-18 18:11:13

1

另一種選擇是scan()。要獲得第二個值,我們可以使用邏輯子集。

scan(text = tmp3)[c(FALSE, TRUE)] 
# [1] 2 1 2 1 2 1 2 1 2 1