【问题标题】:Grab two variables from structured character vector and create data frame从结构化字符向量中获取两个变量并创建数据框
【发布时间】:2019-02-19 06:47:26
【问题描述】:

让我们有以下向量:

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

【问题讨论】:

  • 避免使用vector 之类的名称。如果有疑问,请先尝试?variable_name here,然后再选择将其用作变量名。

标签: r dataframe vector


【解决方案1】:

你可以试试:

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.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,空格用作分隔符,逗号用作小数,然后选择前两列。

【讨论】:

    【解决方案2】:

    试试:

    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
    

    【讨论】:

      【解决方案3】:

      另一个有趣的解决方案是使用来自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
      

      【讨论】:

        猜你喜欢
        • 2017-12-08
        • 2015-04-22
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多