Разделение строки с разделителями-запятыми на несколько столбцов и присвоение 0 пробелу

В моем 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

person inarts    schedule 10.11.2013    source источник
comment
Ваш вопрос не ясен ни в фактическом формате ввода ваших данных, ни в желаемом формате вывода.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 10.11.2013


Ответы (1)


Вот две альтернативы для рассмотрения, в зависимости от того, что вы на самом деле ожидаете в качестве результата.

Первый вариант выводит набор векторов, но я считаю, что это немного ненужно и может быстро засорить ваше рабочее пространство большим количеством объектов.

Второй вариант, который я предпочитаю, создает удобный 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
person A5C1D2H2I1M1N2O1R2T1    schedule 10.11.2013
comment
Вариант 2 подойдет мне, но проблема в том, что всякий раз, когда в текстовой строке есть пустое место в первом элементе (перед запятой), оно отображается не как 0, а как NULL или (empty field). Почему так, как вы думаете? Вот пример: Z[3, c(1, 3, 5)] # V1 V3 V5 # 3 NULL 0 99 - person inarts; 10.11.2013
comment
@inarts, без примера кода, который воспроизводит то, что вы описываете, очень сложно сказать. Если вы думаете, что это как-то связано с пробелами, добавьте strip.white = TRUE к строке read.csv и посмотрите, поможет ли это. - person A5C1D2H2I1M1N2O1R2T1; 10.11.2013
comment
@ Ананда Махто, причина, по которой я получаю NULL, 0, 0, 0, 0, 0, заключается в том, что у меня есть некоторые строки (в некоторых строках), которые записываются как NULL (при преобразовании они отображаются как NULL, 0, 0, 0, 0, 0). Однако, когда перед первой запятой стоит no space (и нет числа), при преобразовании он отображается как пустой ввод. Я последовал вашему предложению с strip.white = TRUE, но это не решает ни первую, ни вторую проблему. Должен ли я сначала попытаться исключить строки, содержащие NULL? Вот вектор, с которым у меня проблемы с x.cvs x.cvs, если вы можете взглянуть на него. - person inarts; 10.11.2013
comment
@inarts, вы можете попробовать что-то вроде X <- scan("path/to/x.csv", what=""); Z <- read.csv(text = X[X != "NULL"], header = FALSE), чтобы избавиться от строк NULL. - person A5C1D2H2I1M1N2O1R2T1; 11.11.2013
comment
объединение советов, которые вы предоставили в своих ответах, отлично сработало для моих данных. Результаты выглядят так, как ожидалось. Я больше не вижу NULL и пустых мест. - person inarts; 11.11.2013