Импорт первых трех и последних трех полей из CSV с переменным количеством полей

У меня есть набор данных в CSV. К сожалению, каждая строка имеет различное количество "," запятых. Я заинтересован в импорте только первых 3 и 3 последних переменных из файла в R.

в примере:

> line: "A","B","C","D",...,"X",Y","Z"

Я хочу добиться следующего `

> line: "A","B","C","X","Y","Z"

Я попытался использовать grep, чтобы найти - с помощью регулярных выражений - первые 3 переменные:

new_data <- grep("([^,]+)(,[^,]+){2}", dataset, values=TRUE)

После этой операции он показывает мне все строки, в которых существует это выражение.

Как я могу удалить следующие переменные в строке, используя grep, если это возможно, как я могу удалить весь интервал (каждая переменная из <3;n-3>).

У вас сейчас другой способ решить эту проблему?

3 ответа

Решение

Используя комбинацию apply а также head а также tail:

d2 <- data.frame(t(apply(d1, 1, function(x) c(head(x[x != ''],3), tail(x[x != ''],3)))))

в результате чего:

> d2
  X1 X2 X3 X4 X5 X6
1  a  b  c  x  y  z
2  a  b  c  g  h  i
3  a  b  c  t  u  v

Используя данные @VarunM:

d1 <- read.csv(text='a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
a, b, c, d, e, f, g, h, i
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v', header = FALSE, fill = TRUE)

Попробуй awk-

awk -F, '{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}' file

-F, меняет разделитель полей на запятую.

NF последнее поле в наборе данных.NF-1 а также NF-2 очевидны

Я сделал образец файла

$cat file.csv
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 
a, b, c, d, e, f, g, h, i
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v

При выполнении

$awk -F, '{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}' file.csv

Выход-

a  b  c  x  y  z 
a  b  c  g  h  i
a  b  c  t  u  v

редактировать

Это решение работает очень хорошо, если вы делаете следующее:

> system('awk -F, \'{print $1, $2, $3, $(NF-2), $(NF-1), $(NF)}\' file.csv')

Где file.csv - файл, содержащий данные.

Решения для командной строки будут проще, но если вам нужно решение внутри R, в коде R, то отфильтруйте входящий CSV через textConnection и используйте строковые операции или регулярное выражение для извлечения первых и последних трех полей:

csvConn <- textConnection('your.csv')
<use string operations or regex to extract the first and last three fields>
read.csv(data = csvFixed, ...)

Это работает, я делал это раньше. Посмотрите другие похожие решения, включающие textConnection и read.csv (data =...). Я не мог найти очень чистый пример, хотя.

Другие вопросы по тегам