2016-04-28 31 views
1

我有一个如下所示的数据框。如何在R数据帧中执行行数明细比较

SampleDF <- structure(list(FirstVal = c(100, 230, 450, 600), SecondVal = c(566, 
547, 557, 250), ThirdVal = c(782, 479, 823, 178), LowerLimit = c(10, 
15, 22, 50), UpperLimit = c(600, 500, 600, 500)), .Names = c("FirstVal", 
"SecondVal", "ThirdVal", "LowerLimit", "UpperLimit"), row.names = c(NA, 
4L), class = "data.frame") 

我曾经和一个名为FirstVal, SecondVal and ThirdVal列中的两个计算列UpperLimit and LowerLimit

我试图从每行中选取元素,这些元素落在下限和上限内,并丢弃超出UpperLimit的任何元素。消除后,我想找出哪些元素是其余的最大的,并将其添加到一个新的列。

此外,我希望与它一起添加列名称。我尝试通过转置我的原始数据框来完成此操作,但我在引用原始列时遇到了问题。

如何在R中执行行对比比较?


预期输出:

SampleDFNew 
    FirstVal SecondVal ThirdVal LowerLimit UpperLimit MaxValBelowUpperLim ColumnName 
1  100  566  782   10  600     566 SecondVal 
2  230  547  479   15  500     479 ThirdVal 
3  450  557  823   22  600     557 SecondVal 
4  600  250  178   50  500     250 SecondVal 

回答

1

这工作!

1.首先找出不属于限值的值并将其删除。

2.找到其中最多的元素,并从姓名中提取姓名。

x<-sapply(SampleDF[,1:3],function(x) ifelse(x > SampleDF$LowerLimit & x < SampleDF$UpperLimit,x,NA)) 

SampleDf$Columnname <- colnames(x)[apply(x,1,which.max)] 
+0

为什么给下面的错误,如果我尝试使用的功能(有光泽的反应或简单的函数)内的上述过程? 'colnames(x_r)中的错误[apply(x_r,1,which.max)]:无效的下标类型'list'' – sunitprasad1

2

你可以试试:

tmp<-(SampleDF[,1:3]>=SampleDF$LowerLimit & SampleDF[,1:3]<=SampleDF$UpperLimit)*as.matrix(SampleDF[,1:3]) 
colnames(SampleDF[,1:3])[max.col(tmp*NA^(rowSums(tmp)==0))] 
#[1] "SecondVal" "ThirdVal" "SecondVal" "SecondVal" 
+0

完美!但@koundy首先发布它,所以我“接受”了这个答案。 – sunitprasad1

+2

没问题,很高兴它有帮助。还要考虑我的解决方案是矢量化的,应该快得多。 – nicola

+0

是的,它的速度更快。 – sunitprasad1