将逗号分隔的字符串拆分为多个列,并将0分配给nospace

时间:2013-11-10 09:14:31

标签: string r replace split strsplit

在我的data.frame向量x中包含文本字符串(每个字符串中有逗号分隔的六个值(从0到100)),格式为:

x[1] "3,2,4,34,2,9"
x[2] "45,,67,,,"
x[3] ",,,,99,"

以下是我遇到问题的实际矢量的链接:x.cvs x.cvs

不幸的是,“0”的值在两个逗号之间,或在第一个逗号之前,或在最后一个逗号之后记录为“空无空格”。

首先能够将其转换为:

x[1]  "3,2,4,34,2,9"
x[2]  "45,0,67,0,0,0"
x[3]  "0,0,0,0,99,0"

但最重要的是,我想将这个向量分成6个不同的向量x1,x2,x3,x4,x5,x6,并且每个向量都从字符串中取值,并用逗号之间的“无空格”替换例如,“0”,结果应为:

x1[3] 0
x6[2] 0

我认为如果逗号之间有值,strsplit()会起作用,但由于没有值,甚至没有空格,我不确定什么是正确的方法,而不是获得NA。

我尝试了以下内容,但它确实给了我很多错误:

x<- as.character(x)
x <- gsub(",,", ",0,", x)
x <- gsub(", ,", ",0,", x)
splitx = do.call("rbind", (strsplit(x, ",")))
splitx = data.frame(apply(splitx, 2, as.numeric))
names(splitx) = paste("x", 1:6, sep = "")

我收到错误......

In rbind(c("51", "59", "59", "60", "51", "51"), c("51", "59", "59",  :
  number of columns of result is not a multiple of vector length (arg 10994)
 In apply(splitx, 2, as.numeric) : NAs introduced by coercion

1 个答案:

答案 0 :(得分:2)

根据您实际期望的输出结果,可以考虑以下两种方法。

第一个选项输出一组向量,但我发现有点不必要,并且可以使用大量对象快速丢弃工作区。

我更喜欢第二个选项,它会创建一个方便的data.frame,每行代表矢量“x”中的一个项目。

样本数据

x <- vector()
x[1] <- "3,2,4,34,2,9"
x[2] <- "45,,67,,,"
x[3] <- ",,,,99,"

选项1

Names <- paste0("A", seq_along(x))
for (i in seq_along(x)) {
  assign(Names[i], {Z <- scan(text=x[i], sep=","); Z[is.na(Z)] <- 0; Z})
}
A1
# [1]  3  2  4 34  2  9
A2
# [1] 45  0 67  0  0  0
A3
# [1]  0  0  0  0 99  0

选项2

Z <- read.csv(text = x, header = FALSE)
Z[is.na(Z)] <- 0
Z
#   V1 V2 V3 V4 V5 V6
# 1  3  2  4 34  2  9
# 2 45  0 67  0  0  0
# 3  0  0  0  0 99  0

data.frame中提取值就像指定所需的行和列一样简单。

Z[1, 3]
# [1] 4
Z[2, 4]
# [1] 0
Z[3, c(1, 3, 5)]
#   V1 V3 V5
# 3  0  0 99