簡體   English   中英

從結構化字符向量中抓取兩個變量並創建數據框

[英]Grab two variables from structured character vector and create data frame

讓我們有以下向量:

vector <- c("0:00 0,6 0:00", "5:00 1,2 5:00","9:30 0,9 22:00","16:00 1,0","21:30 0,9")

我們看到該元素包含:

小時,數字(例如“ 0,6”),小時2(或空白)

似乎是結構化的:“:”之后始終是兩位數字(“ 00”或“ 30”),然后是“”和帶小數點的數字(逗號)。

我想創建數據框並獲取包含第一個小時和給定數字的數據框,例如:

#Expected result:
df
$hours $value
#0:00   0.6
#5:00   1.2
#9:30   0.9
#16:00  1.0
#21:30  0.9

你可以試試:

data.frame(hours = sapply(strsplit(vector, " "), function(x) x[1]),
value = sapply(strsplit(vector, " "), function(x) x[2]))

  hours value
1  0:00   0,6
2  5:00   1,2
3  9:30   0,9
4 16:00   1,0
5 21:30   0,9

它首先通過strsplit()分割向量,然后將第一個和第二個元素data.framedata.frame

如果您還想用小數點替換逗號:

data.frame(hours = sapply(strsplit(vector, " "), function(x) x[1]),
value = sub(",", ".", sapply(strsplit(vector, " "), function(x) x[2])))

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9

它的作用與上面的代碼相同,但是它也使用sub()將第二個元素中的逗號替換為十進制。

要么:

df <- read.table(text = vector, sep = " ", dec = ",", as.is = TRUE, fill = TRUE)[, 1:2]
colnames(df) <- c("hours", "value")

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9

它將向量轉換為data.frame ,其中空格用作分隔符,逗號用作十進制,然后選擇前兩列。

嘗試:

vec1<-sapply(strsplit(vector," "),"[")
df<-plyr::ldply(vec1,function(x) x[1:2])
names(df)<-c("hours","value")       
df$value<-gsub(",",".",df$value)

結果:

  hours value
1  0:00   0.6
2  5:00   1.2
3  9:30   0.9
4 16:00   1.0
5 21:30   0.9

另一個有趣的解決方案是使用stringr包中的word ,即

library(stringr)
data.frame(hours = word(vector, 1), 
           values = as.numeric(sub(',', '.', word(vector, 2), fixed = TRUE)), 
           stringsAsFactors = FALSE)

這使,

  hours values 1 0:00 0.6 2 5:00 1.2 3 9:30 0.9 4 16:00 1.0 5 21:30 0.9 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM