2016-11-27 72 views
-1

我有一个数据帧象下面这样:R中如何有效地检查列的值在数据帧是全零

 Profit     Title MonthText OCT JAN AUG SEP APR MAR MonthInd 

13 -11821431  Alone in the Dark  JAN 0 1 0 0 0 0  1 
21 78114471  Are We There Yet?  JAN 0 1 0 0 0 0  1 
27 19944017    Be Cool  MAR 0 0 0 0 0 1  1 
28 13351350   Beauty Shop  MAR 0 0 0 0 0 1  1 
29 18508485 Because of Winn-Dixie  FEB 0 0 0 0 0 0  0 
38 47192859    Boogeyman  FEB 0 0 0 0 0 0  0 

我想基于列OCT的值来改变MonthInd整个数据帧JAN AUG SEP APR MAR

因此,如果任何列值(OCT JAN AUG SEP APR MAR)是1,那么MonthInd = 0否则所有列值(OCT JAN AUG SEP APR MAR)都是0,那么MonthInd = 1

我一个接一个地尝试,这就是我想应用于运行为测试:例如,对于第1行,

(all(test[1,c(4:9)] == 0)) 

但我想将它应用到测试中的所有行而不做一个for循环的n行

这可能吗?

回答

0

我想你兴趣在MonthInd的逐行结果中,并且您承诺该值将是0或正

test[ , "MonthInd"] <- 
     rowSums(test[ , c('OCT','JAN', 'AUG', 'SEP', 'APR', 'MAR')]) > 0 

#---- 
> test 
     Profit     Title MonthText OCT JAN AUG SEP APR MAR MonthInd 
13 -11821431  Alone in the Dark  JAN 0 1 0 0 0 0  TRUE 
21 78114471  Are We There Yet?  JAN 0 1 0 0 0 0  TRUE 
27 19944017    Be Cool  MAR 0 0 0 0 0 1  TRUE 
28 13351350   Beauty Shop  MAR 0 0 0 0 0 1  TRUE 
29 18508485 Because of Winn-Dixie  FEB 0 0 0 0 0 0 FALSE 
38 47192859    Boogeyman  FEB 0 0 0 0 0 0 FALSE 

另一个选项是与使用any (... == 1)一个匿名函数运行apply

0

如果我们需要比较的行,我们可以遍历列,以0比获得TA logicallist载体,我们Reduce&一个逻辑向量和强迫与as.integer为二进制。这应该是有效的。

test$MonthInd <- as.integer(!Reduce(`&`, lapply(test[, 4:9], `==`, 0))) 
test$MonthInd 
#[1] 1 1 1 1 0 0 

或者它可能是

as.integer(Reduce(`&`, lapply(test[4:9], `==`, 0))) 
#[1] 0 0 0 0 1 1 

标题说要efficiently check values in column。在这种情况下,转换列4:9逻辑矩阵,然后做colSums

colSums(test[, 4:9]==0)==nrow(test) 
# OCT JAN AUG SEP APR MAR 
# TRUE FALSE TRUE TRUE TRUE FALSE 

或者使用否定

!colSums(test[, 4:9]!=0) 
# OCT JAN AUG SEP APR MAR 
# TRUE FALSE TRUE TRUE TRUE FALSE 

或者使用dplyr

library(dplyr) 
test %>% 
     summarise_each(funs(all(.==0)), OCT:MAR) 
# OCT JAN AUG SEP APR MAR 
#1 TRUE FALSE TRUE TRUE TRUE FALSE 
+0

我想要的是如果OCT,JAN,AUG,SEP,APR,MAR = 0中的所有值都等于1 MonthInd 1 –

+0

@EB它在我的答案的第一部分中用'Reduce'。我被你的头衔分散了 – akrun

相关问题