Импорт первых трех и последних трех полей из 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 =...). Я не мог найти очень чистый пример, хотя.