意外的rbind行为:for循环中没有添加任何行

时间:2014-05-06 14:48:36

标签: r for-loop dataframe rbind

编辑: 我从一个由大约4000行和3列组成的温和的大数据框开始。第一列给出一个数字,第二个字母(我称之为医院名称),第三列是状态(2个字母的缩写)。我必须生成一个显示医院名称(第2行)及其状态的数据框,如下所示(仅显示2行):

         hospital state
    1      A      AK
    2      B      MD

我需要实现的是一个功能,它可以提取医院排名(更低的更好),并为所有州提供医院在该州给定位置的数据框。 我已经写了一个模拟

sim<-data.frame(c(rnorm(4000, 2, 3)), sample(letters, size=4000, replace=T),          sample(ST, size=4000, replace=T ))

simrank<- function(letter="a", num=1) {

Srank<-data.frame()
set<-data.frame()

for (i in 1:length(ST)){
    Srank<-sim[sim[,3]==ST[i], c(1, 2)]
    Srank<-Srank[order(Srank[,1], Srank[,2], decreasing=F),]
    Srank<-cbind(Srank, c(1:length(Srank[,1])))
    Srank<-Srank[Srank[,3]==num, 2]
    newr<-c(Srank[2], ST[i])
    set<-rbind(set, newr)

}
colnames(set)<-(c("hospital", "state"))
set
}

我一直在:

       hospital state
    1      <NA>    AK
    2      <NA>  <NA>
    3      <NA>  <NA>

ST矢量是:

    ST<-c("AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "GU", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC" ,"ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR", "RI", "SC", "SD" ,"TN", "TX", "UT", "VA", "VI", "VT", "WA", "WI", "WV", "WY)        

第一篇文章

我的代码是:

Hrank<-data.frame()
set<-data.frame()

for (i in 1:length(ST)){
    Hrank<-dat[dat[,7]==ST[i], c(2, outcome)]                          #subset a larger data frame 
    Hrank<-Hrank[order(Hrank[,2], Hrank$Hospital.Name, decreasing=F),] #sort data frame
    Hrank<-cbind(Hrank, c(1:length(Hrank[,1])))                        #add a row that gives a rank
    Hrank<-Hrank[Hrank[,3]==num, 1]                                    #Subsets the data frame again
    str(Hrank) #just checking 
    newr<-c(Hrank[1], ST[i])                                           #create the vector to bind in data frame "set"
    str(newr)                                                          #just checking
    set<-rbind(set, newr) #bind in set by row. 

}
colnames(set)<-(c("hospital", "state"))

set

所以,基本上我希望在我的ST变量(在这种情况下是54x2数据帧)中放置一个整齐的数据帧,以获得尽可能多的对象。我得到了什么:

    head(output)
                             hospital state
    1  MAT-SU REGIONAL MEDICAL CENTER    AK
    2                            <NA>  <NA>
    3                            <NA>  <NA>
    4                            <NA>  <NA>
    5                            <NA>  <NA>
    6                            <NA>  <NA>

另外,srt(newr)返回2个对象的字符向量,如预期的那样。我不知道发生了什么,实际上对解决方案毫无头绪。我只能怀疑for循环与它有关,但这是一个疯狂的猜测。

1 个答案:

答案 0 :(得分:0)

如果你想要反叛,它们应该是类似的。此外,在向data.frame添加行时,必须匹配列名。因此,要使此示例正常工作,您需要使用正确的名称

初始化set
set<-data.frame(hospital=character(), state=character())

然后而不是

newr<-c(Hrank[1], ST[i])bind in data frame "set"
set<-rbind(set, newr) #bind in set by row. 

你可以做到

set<-rbind(set, data.frame(hospital=Hrank[[1]], state=ST[i]))