Наборы в R DataFrame - PullRequest
       6

Наборы в R DataFrame

4 голосов
/ 12 августа 2011

У меня есть CSV, который выглядит как

 Deamon,Host,1:2:4,aaa.03
 Pixe,Paradigm,1:3:5,11.us

Мне нужно прочитать это в кадре данных для анализа, но 3-й столбец в моих данных разделен: и должен быть прочитан как набор или список1.e разделен на: так что он возвращает (1,2,4).Можно ли иметь столбцы, у которых есть список классов в R.Или как вы думаете, как лучше я могу подойти к этой проблеме.

Ответы [ 3 ]

4 голосов
/ 12 августа 2011

Вы можете использовать strsplit, чтобы разбить символьный вектор на список компонентов:

x <- c("1:2:4", "1:3:5")
strsplit(x, split=":")
[[1]]
[1] "1" "2" "4"

[[2]]
[1] "1" "3" "5"
4 голосов
/ 12 августа 2011

Как отмечено выше, ответ будет варьироваться в зависимости от того, является ли количество разделителей в столбцах постоянным или нет. Ответ будет более прямым, если это число соответствует. Вот один ответ, чтобы сделать это здание из ответа strsplit Андри:

dat <- read.csv("yourData.csv", header=FALSE, stringsAsFactors = FALSE)

#If always going to be a consistent number of separators
dat <- cbind(dat, do.call("rbind", strsplit(dat[, 3], ":")))

       V1       V2      V3     V4 1  2  3
1  Deamon     Host 1:02:04 aaa.03 1 02 04
2    Pixe Paradigm 1:03:05  11.us 1 03 05

Обратите внимание, что вышеизложенное по сути представляет собой способ реализации colsplit.character из пакета reshape и может быть лучшим вариантом для вас, так как заставляет вас давать правильные имена.

Если количество разделителей отличается, тогда использование rbind.fill является опцией из пакета plyr. rbind.fill ожидает data.frames, что немного раздражает, и я не мог понять, как получить data.frame из одной строки без предварительного преобразования в матрицу, поэтому я думаю, что это можно сделать более эффективным, но вот основные идея:

library(plyr)
x <- c("1:2:4", "1:3:5:6:7")
rbind.fill(
  lapply(
    lapply(strsplit(x, ":"), matrix, nrow = 1)
  , as.data.frame)
)

  V1 V2 V3   V4   V5
1  1  2  4 <NA> <NA>
2  1  3  5    6    7

Который затем может быть cbind ed, как показано выше.

1 голос
/ 12 августа 2011

Попробуйте использовать gsub для замены этого символа:

R> str <- "1:2:4"
R> str
[1] "1:2:4"
R> gsub(":", ",", str)
[1] "1,2,4"

Убедитесь, что столбец является строкой, а не фактором заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...