1

在我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,每个向量都从字符串中取值,并将逗号之间的“no space”替换为“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
4

1 回答 1

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

从 a 中提取值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
于 2013-11-10T09:33:03.490 回答