У меня есть несколько data.frames, каждый из которых имеет коэффициент. Я хочу убедиться, что все они используют одни и те же уровни. Каков правильный способ сделать это?Лучший способ сделать коэффициенты уровней однородными по нескольким кадрам данных
В приведенном ниже коде вы увидите, что я переназначаю коэффициент для каждого случая, используя уровни из общего набора уровней с небольшой функцией changeLevels. Я бы ожидал, что есть лучший способ сделать это.
set.seed(1234)
b<-round(runif(100,1,10),digits=2)
set.seed(2345)
b2<-round(runif(100,11,20),digits=2)
set.seed(3456)
b3<-round(runif(50,15,18),digits=2)
#.. all potential levels
bt<-factor(sort(c(b,b2,b3)))
lvls<-levels(bt)
t1<-as.data.frame(table(sample(b,5)))
t2<-as.data.frame(table(sample(b,1)))
t3<-as.data.frame(table(sample(b,1)))
t4<-as.data.frame(table(sample(b,8)))
t5<-as.data.frame(table(sample(b2,20)))
t6<-as.data.frame(table(sample(b3,18)))
t1<-cbind(t1,p="A")
t2<-cbind(t2,p="B")
t3<-cbind(t3,p="C")
t4<-cbind(t4,p="D")
t5<-cbind(t5,p="E")
t6<-cbind(t6,p="F")
d<-data.frame()
d<-rbind(d,t2,t3,t6,t4,t5,t1)
#.. out of order bins
ggplot(d,aes(x=factor(Var1),fill=factor(p))) +
geom_bar(aes(weight=Freq)) +
facet_grid(p ~ ., margins=T)+
ggtitle("out of order bins")
changeFactor<-function(t,lvls){
temp<-as.numeric(as.character(t))
factor(temp,levels=lvls)
}
t1$Var1<-changeFactor(t1$Var1,lvls)
t2$Var1<-changeFactor(t2$Var1,lvls)
t3$Var1<-changeFactor(t3$Var1,lvls)
t4$Var1<-changeFactor(t4$Var1,lvls)
t5$Var1<-changeFactor(t5$Var1,lvls)
t6$Var1<-changeFactor(t6$Var1,lvls)
d<-data.frame()
d<-rbind(d,t2,t3,t6,t4,t5,t1)
#.. in order bins
ggplot(d,aes(x=factor(Var1),fill=factor(p))) +
geom_bar(aes(weight=Freq)) +
facet_grid(p ~ ., margins=T)+
ggtitle("in order bins")
Благодарим вас. Вы используете некоторые функции, с которыми я не знаком. – bob123
Вы используете некоторые функции, с которыми я не знаком. Я понял, что после публикации я мог бы использовать следующее: d2 $ Var1 <-unlist (tapply (d $ Var1, d $ p, function (dd) changeFactor (dd, lvls))) вместо некоторого кода. Мой пример должен был быть простым примером, поскольку моя настоящая проблема связана с чрезвычайно большими наборами данных. Ваш комментарий относительно «stringsAsFactors» очень важен в этом случае. – bob123
@ bob123: Если ваши большие наборы данных содержат действительно большие векторы факторов, имейте в виду, что опция 'stringsAsFactor = FALSE' заставит вас манипулировать очень большими векторами * строк *, которые намного тяжелее самих факторов (хранятся как простые целые числа в памяти), особенно если ваши уровни имеют длинные имена. Если бы это было так, вам лучше было бы строить свои векторы как факторы с правильными уровнями, а затем использовать их в качестве факторов. –