将字符数组转换为数据帧的简便方法

时间:2014-11-17 21:57:35

标签: r hadoop-streaming

我正在使用R和Hadoop流,在reducer中,值是一个字符数组,其中每个元素是一个字符串,包含一些以某些字符终止的列,在这种情况下为char(2)002

是否有一种简单的方法可以将字符串拆分为三个字段并从中构建数据框?

这就是我所做的,但我感觉我已经过度设计了它。

inputarray <- c("20130806\00211\00291.55", "20130807\00211\00291.55", "20130808\00211\00291.55", 
  "20130809\00211\00291.55", "201308010\00211\00291.55", "201308011\00211\00291.55", 
  "201308012\00211\00291.55", "201308013\00211\00291.55", "201308014\00211\00291.55"
)

tmp <- lapply(inputarray, FUN=function(x) strsplit(x, rawToChar(as.raw(2))) )
tmp <- data.frame(matrix(unlist(tmp), ncol=3, byrow=TRUE))
names(tmp) <- c("date", "qtyavail", "price")
tmp

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用read.table。首先,我在inputarray

的开头为名称添加元素
x <- c("date\002qtyavail\002price", inputarray)
read.table(text = x, sep = rawToChar(as.raw(2)), header = TRUE)
#        date qtyavail price
# 1  20130806       11 91.55
# 2  20130807       11 91.55
# 3  20130808       11 91.55
# 4  20130809       11 91.55
# 5 201308010       11 91.55
# 6 201308011       11 91.55
# 7 201308012       11 91.55
# 8 201308013       11 91.55
# 9 201308014       11 91.55

或者,您也可以使用cSplit

中的splitstackshape
library(splitstackshape)
dt <- cSplit(data.table(x = inputarray), "x", rawToChar(as.raw(2)))
setnames(dt, names(dt), c("date", "qtyavail", "price"))
dt
#         date qtyavail price
# 1:  20130806       11 91.55
# 2:  20130807       11 91.55
# 3:  20130808       11 91.55
# 4:  20130809       11 91.55
# 5: 201308010       11 91.55
# 6: 201308011       11 91.55
# 7: 201308012       11 91.55
# 8: 201308013       11 91.55
# 9: 201308014       11 91.55

答案 1 :(得分:0)

这是使用tidyr

执行此操作的另一个选项
library(tidyr)

separate(as.data.frame(inputarray), inputarray, 
         into = c("date", "qtyavail", "price"), sep = rawToChar(as.raw(2)))

#       date qtyavail price
#1  20130806       11 91.55
#2  20130807       11 91.55
#3  20130808       11 91.55
#4  20130809       11 91.55
#5 201308010       11 91.55
#6 201308011       11 91.55
#7 201308012       11 91.55
#8 201308013       11 91.55
#9 201308014       11 91.55

注意:您的“inputarray”是一个字符 vector 而不是R中的数组。