2015-11-14 2 views
1

Я с R dataframe, как это содержащие цены в разное времяSubset на основе обоих столбцов и строк

 product_1 product_2 product_3 product_4 product_5 
t1 10   10   10   0   14 
t2 20   0   50   15   15 
t3 30   0   60   12   12 
t4 40   14   15   5   0 

Что запрос дал бы мне все таблицы, содержащие цены на все времена для продуктов, цена 0 в минимум один раз после определенного времени = t2? В основном это подмножество кадра данных на основе как условий строки, так и столбца.

 product_2 product_5 
t1 10   14 
t2 0   15 
t3 0   12 
t4 14   0 

ответ

5

чтения данных:

dd <- read.table(header=TRUE,text=" 
    product_1 product_2 product_3 product_4 product_5 
t1 10   10   10   0   14 
t2 20   0   50   15   15 
t3 30   0   60   12   12 
t4 40   14   15   NA   0") 

Найти индекс критического времени:

which.time <- which(rownames(dd)=="t2") 

Функция для определения столбцов для сохранения (также можно использовать any(na.omit(tail(x,-which.time)==0)); na.omit() необходимо избегать NA s окончание в логическом векторе, который указывает, какие столбцы сохранить, что приведет к слегка неясной ошибке undefined columns selected ...

keepvar <- function(x) { 
    any(na.omit(x[-(1:(which.time-1))])==0) 
} 

Теперь сделайте фактический выбор:

dd[sapply(dd,keepvar)] 
+0

Хорошо, я не уверен, что здесь не так, но ваш код работает, но как только поскольку я применяю его на своей огромной таблице с 1663 строками и 8000 столбцами, я получаю эту ошибку: «Ошибка в'. .data.frame' (dd, sapply (dd, keepvar)): не определены определенные столбцы « Только разница I Калифорния Я вижу, что я читаю dataframe как csv, так как R не может создать таблицу для такого большого количества значений. Какие-либо предложения? –

+0

Я смущен. Что значит «Я читаю DataFrame как csv»? CSV - это внешний формат файла. Какую функцию вы использовали для чтения фрейма данных (вы использовали функцию из пакета)? Что такое 'class (your_dataframe)'? –

+0

Я имел в виду, что я прочитал свой csv в dataframe. Класс is data.frame PS. Я могу видеть, что which.time содержит правильное значение для моего набора данных. И функция кажется совершенно прекрасной, но я теряюсь, когда дело доходит до ошибки. –

2

Предполагая, что ваши данные называют df

df[,as.logical(apply(df, 2, function(x) sum(x[as.logical(cumsum(rownames(df)=="t2"))] == 0)))] 
    product_2 product_5 
t1  10  14 
t2   0  15 
t3   0  12 
t4  14   0 
+0

У меня такая же проблема, как я прокомментировал решение выше вашего, даже с вашим подходом. Я здесь полностью потерян. Какие-либо предложения? –

Смежные вопросы