2017-06-01 67 views
0

的前x%,如果换上假的观察我有一个大的数据帧的一些数据(约80x300),看起来是这样的:的R - 在VAR

dum <- data.frame(id=c("a", "b", "c", "d", "e"), 
       v1=c(2, 7, 8, 5, 0), 
       v2=c(9, 2, 4, 6, 1), 
       v3=c(2, 2, 6, 1, 7)) 

我想谈谈每个变量成一个二分变量,表示每个特定观察值是否在每个变量的前20%。 {稍后我将合并虚拟数据集和原始数据集,这对于现在来说并不重要,但如果任何人想要获得创意,那就是完整的计划。}现在输出数据框应该看起来像这样:

id  v1  v2  v3 
a  0  1  0 
b  0  0  0 
c  1  0  0 
d  0  0  0 
e  0  0  1 

我在此尝试如下所示:

top <- 20 # set percentage 
for(i in 2:ncol(dum)) { 
    for(j in 1:nrow(dum)) { 
    ifelse(dum[j,i]>=unname(quantile(dum[,i],probs=((100-top)/100))), dum[j,i]<-1, dum[j,i]<-0) 
    } 
} 

然而,当我运行此命令我最终得到更多的人比在某些情况下,期望在输出数据集中和准确的数量我想在其他情况下。它看起来像这样:

id  v1  v2  v3 
a  0  1  0 
b  0  0  0 
c  1  0  0 
d  1  1  0 
e  0  1  1 

任何人都可以帮助确定我要去哪里错了吗?一些注意事项:1)我准备好讨厌使用循环,尤其是嵌套循环,但这是我熟悉的事情,计算时间在这里不是问题。 2)基于我的谷歌搜索似乎使用应用系列的功能可能是有用的,但我不是很熟悉它们,所以我不知道从哪里开始。 3)我包括unname()命令作为尝试修复,但运行相同或不运行。 4)ifelse()声明的YES/NO部分对我来说很有趣,但是当我试图做ifelse(cond, 1, 0)时,它没有对数据帧做任何改变,我不明白为什么。

谢谢!

回答

3

您可以使用applyifelse来执行此操作。请看下图:

apply(dum[2:4],2,function(x) {ifelse(x>=quantile(x,.8),1,0)}) 

这将返回:

 v1 v2 v3 
[1,] 0 1 0 
[2,] 0 0 0 
[3,] 1 0 0 
[4,] 0 0 0 
[5,] 0 0 1 

请注意,我用dum[2:4]识别相关栏目进行条件测试。使用完整数据集时,应该修改此选项,以仅选择所需的相关列。

如果要合并与原来的数据,你可以添加:

dum2 = cbind(dum,apply(dum[2:4],2,function(x) {ifelse(x>=quantile(x,.8),1,0)})) 

将返回:

id v1 v2 v3 v1 v2 v3 
1 a 2 9 2 0 1 0 
2 b 7 2 2 0 0 0 
3 c 8 4 6 1 0 0 
4 d 5 6 1 0 0 0 
5 e 0 1 7 0 0 1 
+2

真棒。我需要了解更多关于apply函数的信息。 (dum [2:4],2,function(x){ifelse(x> = quantile(x,.8),1,0)}也许你应该在绑定前应用一个后缀。 ) colnames(傻瓜)< - paste(colnames(傻瓜),“dummy”,sep =“_”) dum2 = cbind(dum,dummies)' – pyll

+0

谢谢,你的代码比我的优雅得多,但它并没有解决我得到的问题比我应该得到的更多。我得到不同数量的1。你有什么想法,为什么这可能是? – seeellayewhy

+0

@pyll好点。在使用这个事实后,我做了它:'colnames(out)[5:7] < - paste0(colnames(dum)[2:4],“_dummy”)' – seeellayewhy