В C #:
public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] {e}).Concat(c)));
}
Использование:
var result = Combinations(new[] { 1, 2, 3, 4, 5 }, 3);
Результат:
123
124
125
134
135
145
234
235
245
345
Используйте список:
> x <- list()
> x[[1]] <- c(-0.438185, -0.766791, 0.695282)
> x[[2]] <- c(-0.759100, 0.034400, 0.524807)
> x
[[1]]
[1] -0.438185 -0.766791 0.695282
[[2]]
[1] -0.759100 0.034400 0.524807
Думайте об этом как о карте / словаре / ассоциативном массиве, который индексируется целым числом.
И если вы хотите взять строку, подобную приведенной выше, и превратить ее в список векторов:
> s <- "-0.438185 -0.766791 0.695282\n0.759100 0.034400 0.524807"
> x <- lapply(strsplit(s, "\n")[[1]], function(x) {as.numeric(strsplit(x, '\\s+')[[1]])})
> x
[[1]]
[1] -0.438185 -0.766791 0.695282
[[2]]
[1] 0.759100 0.034400 0.524807
Я использую strsplit для разделения строк новой строкой, а затем снова применяю strsplit к каждой строке. As.numeric используется для преобразования строк в числа, а [[1]] существуют, потому что strsplit выводит список, который нам на самом деле не нужен.
Предположим, что ваши данные представлены в виде фрейма данных с именем, скажем, df
:
library(plyr)
alply(as.matrix(df),1,"[")
дает
$`1`
V1 V2 V3
-0.438185 -0.766791 0.695282
$`2`
V1 V2 V3
0.759100 0.034400 0.524807
Если он читается из файла, скажем data.txt
, это можно сделать следующим образом:
lapply(readLines('data.txt'),function(x) as.numeric(strsplit(x,' +')[[1]]))
StompChicken прав, просто сделайте это со списком. Хотя я хотел бы добавить небольшой трюк, который может помочь вам в обучении на основе существующих структур:
dput(dframe)
выведите некоторый код для создания соответствующего data.frame или вектора. Попробуйте сделать это с любым вектором, фреймом или списком и вы увидите, как он был создан, например:
x= c(1,2,3,4)
dput(x)
echos c(1,2,3,4)