2015-11-14 84 views
1

我在不同的时间子集基于列和行

已经A R数据帧像这种含价格
 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小号结束在逻辑向量中指定要保留哪些列,这将导致稍微模糊的undefined columns selected错误...

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

现在做实际的选择:

dd[sapply(dd,keepvar)] 
+0

好吧,我不知道什么是错在这里,但你的代码工作,但只要(dd,sapply(dd,keepvar))错误:未定义的列被选中“ 只有差异我在我的巨大的表上使用1663行和8000列时,出现此错误:”[.data.frame' CA n看到的是我读取数据帧为csv,因为R无法为这么多的值创建表。有什么建议么? –

+0

我很困惑。你是什​​么意思“我读数据框为csv”? CSV是一种外部文件格式。你用什么函数来读取数据框(你是否使用包中的函数)?什么是class(your_dataframe)'? –

+0

我的意思是我将csv读入数据框。类是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

即使采用了您的方法,我也面临着同样的麻烦,因为我已经对您的解决方案提出了意见。我完全迷失在这里。有什么建议么? –