Я смотрю, как хранить несколько экземпляров разных типов переменных в R. Я пытался использовать dataframes (и списки), но не могу заставить его делать то, что я хочу. Позвольте мне попытаться показать вам пример, которого я хотел бы достичь.многоуровневый кадр данных
Скажем, я создать тип типа данных (корзины), который содержит номер и строку, например:
iNbLine = 2
df<-data.frame(Weight=double(iNbLine), Color=character(iNbLine),stringsAsFactors=F)
row.names(df)<-c("apples","pears")
df
Weight Color
apples 0
pears 0
теперь я могу обновить свою структуру данных, как я хочу. Например:
df$Weight[1]=158
df$Color[1]="green"
df
Weight Color
apples 158 green
pears 0
То, что я хотел бы сделать, однако есть данные более высокого уровня, чем содержит некоторые из этих корзин с дополнительными данными (здесь цена), поэтому я попытался это:
iNbBasket =5
df2<-data.frame(Price=double(iNbBasket), Basket=rep(df,iNbBasket))
Но это дает мне
Error in data.frame(Price = double(iNbBasket), Basket = rep(df, iNbBasket)) : arguments imply differing number of rows: 5, 2
То, что я хотел бы быть в состоянии сделать, это получить доступ вес яблок моей 2-ой корзины, например, сохраняя при этом возможность установить цену второй корзины. Надеюсь, это достаточно ясно. На языке C я думаю, что мне удалось определить новый тип данных (корзина) с помощью «struct», который затем я мог бы включить в другой тип данных, но я не могу понять, как это сделать здесь.
Для @joran это попытка показать, что я хотел бы:
Baskets
Name Price Names Weight Color
Basket1 250 apples 158 green
pears 32 yellow
Basket2 120 apples 70 green
pears 10 yellow
Но, будучи в состоянии получить доступ к линии 3, что-то вроде:
myBasket<-myData[2]
myBasket$Weight[1]
70
и сделать:
myBasket$Price = 130
Обновление 1 Я смотрел через списки, типы переменных S3 и dplyr. Я должен признать, что я не все понял, но пока у меня нет именно того, чего я хочу. Я в настоящее время необходимо сделать следующее
iNbLine = 2
df<-data.frame(Weight=double(iNbLine), Color=c("green","yellow"),stringsAsFactors=F)
row.names(df)<-c("apples","pears")
iNbBasket=3
dfBaskets<-data.frame(Price=double(iNbBasket))
row.names(dfBaskets)=c("Basket1","Basket2","Basket3")
lBasketsContent<-list()
for(i in 1:iNbBasket){
lBasketsContent[[i]]=df
}
Таким образом, я могу получить доступ цена:
iBasket =2
dfBaskets$Price[2] = 150
и любой элемент данной корзины:
lBasketsContent[[2]]$Weight[1] = 300
, а также самой корзины (I передать его функции в моем реальном случае)
Легко читается, но требуется 2 контейнера.
Как правило, кадр данных может быть представлен как единая прямоугольная сетка элементов данных (т.е. подумайте о таблице). Можете ли вы изменить свой вопрос, чтобы включить то, что должна выглядеть прямоугольная сетка для желаемого результата? – joran
Посмотрите на объекты S3 и S4 или посмотрите на создание многомерной матрицы –
@joran, ОК, тогда кадр данных не то, что я хочу, поскольку мне нужны несколько уровней данных. – Djiggy