的前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)
时,它没有对数据帧做任何改变,我不明白为什么。
谢谢!
真棒。我需要了解更多关于apply函数的信息。 (dum [2:4],2,function(x){ifelse(x> = quantile(x,.8),1,0)}也许你应该在绑定前应用一个后缀。 ) colnames(傻瓜)< - paste(colnames(傻瓜),“dummy”,sep =“_”) dum2 = cbind(dum,dummies)' – pyll
谢谢,你的代码比我的优雅得多,但它并没有解决我得到的问题比我应该得到的更多。我得到不同数量的1。你有什么想法,为什么这可能是? – seeellayewhy
@pyll好点。在使用这个事实后,我做了它:'colnames(out)[5:7] < - paste0(colnames(dum)[2:4],“_dummy”)' – seeellayewhy