2016-10-27 16 views
2

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

в примере:

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

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

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

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

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

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

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

Вы теперь другой способ решить эту проблему?

+0

«К сожалению, каждая строка имеет различные количество запятых/полей ". Это можно назвать «оборванным» файлом или «переменным числом полей». – smci

+0

Вы хотите решение внутри R или командной строки, как @VarunM дает? – smci

+0

Внутри R-решения будет классно, я сейчас пытаюсь реализовать решение «awk», предоставляемое Varun. – Meyk

ответ

4

Используя комбинацию 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) 
+1

Ха-ха, этот ввод кажется знакомым ... – VM17

+0

Прохладный, что работает превосходно :) – Meyk

+0

@VarunM использовал ваши данные для удобства ;-) – h3rm4n

2

Попытка 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 

На doing-

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

output-

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 - это файл, содержащий данные.

1

командной строки решения будет легче, но если вы хотите решение внутри 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 and read.csv(data=...). Однако я не мог найти очень чистый пример.