Объединение строк файла CSV со строками переменной длины на основе значения индекса с помощью R - PullRequest
1 голос
/ 11 февраля 2020

У меня есть некоторые временные данные для эксперимента, и я хотел бы сгруппировать их по значению индекса в первом столбце. Значение индекса - это количество элементов, отображаемых в этом столбце, поскольку оно измеряет производительность алгоритма, масштабирующего его по нескольким узлам (значением является количество узлов и время для каждого из них). Таким образом, данные будут выглядеть так:

+---+----------+---------+--+--------+
| 1 |  3596449 |         |  |        |
| 1 |  3526532 |         |  |        |
| 1 |  3525325 |         |  |        |
| 2 | 3595235  | 2432343 |  |        |
| 3 | 3789900  | 2432343 |  | 345675 |
+---+----------+---------+--+--------+

и так далее. Файл, из которого он получен, будет иметь вид:

1,3596449           
1,3526532           
1,3525325           
2,3595235,2432343       
3,3789900,2432343,345675
.
.
.

В идеале это будет:

+---+---------+---------+---------+-----+
| 1 | 3596449 | 3526532 | 3525325 | ... |
| 2 | 3595235 | 2432343 | ...     |     |
| 3 | 3789900 | 2432343 | 345675  | ... |
+---+---------+---------+---------+-----+

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

Я столкнулся с проблемами, поскольку фреймы данных работают только для данных одинаковой длины. Я обнаружил, что списки имеют переменную длину, но я не уверен, как бы я построил этот список из чтения в данных.

Спасибо за любую помощь

1 Ответ

2 голосов
/ 11 февраля 2020

Вы можете прочитать файл с помощью readLines и разделить запятыми с помощью strsplit. Так как вы хотите получить числовой результат c, вы можете удалить пробелы и преобразовать все элементы в числа, используя gsub и as.numeric.

. Затем вы можете преобразовать результаты в нужный формат с помощью apply семейство функций:

contents <- readLines("my_csv.csv")
my_list  <- strsplit(contents, ",")
my_list  <- lapply(my_list, function(x) as.numeric(gsub(" ", "", x)))
index    <- sapply(my_list, function(x) x[1])
my_list  <- lapply(my_list, function(x) x[-1])
result   <- lapply(unique(index), function(x) unlist(my_list[index == x]))

Это дает следующий результат:

result
#> [[1]]
#> [1] 3596449 3526532 3525325
#> 
#> [[2]]
#> [1] 3595235 2432343
#> 
#> [[3]]
#> [1] 3789900 2432343  345675
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...