/ / अप्रत्याशित rbind व्यवहार: लूप के लिए कोई पंक्तियाँ नहीं जोड़ी गईं - r, for-loop, dataframe, rbind

अप्रत्याशित रिबिंड व्यवहार: लूप-आर, फॉर-लूप, डेटाफ्रेम, आरबीआईंड के लिए कोई पंक्तियां नहीं जोड़े

संपादित करें: मैं लगभग 4000 पंक्तियों और 3 स्तंभों से बना एक हल्के बड़े डेटा फ्रेम के साथ शुरू करता हूं। पहला कॉलम एक नंबर को दूसरा अक्षर देता है (जिसे मैं "अस्पताल का नाम कहूँगा") और तीसरा स्तंभ एक राज्य (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<-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

इसलिए, मूल रूप से मैं उम्मीद कर रहा था कि मेरे एसटी वेरिएबल में (जहां इस मामले में 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 ऑब्जेक्ट, जैसा कि अपेक्षित था। मैं नहीं जानता कि क्या हो रहा है और वास्तव में समाधान के लिए कोई सुराग नहीं है। मुझे केवल संदेह है कि लूप के लिए इसके साथ कुछ करना है लेकिन यह एक जंगली अनुमान है।

उत्तर:

जवाब के लिए 0 № 1

यदि आप चीजों को rbind करना चाहते हैं, तो वे समान प्रकार के होने चाहिए। इसके अलावा, जब पंक्तियों को 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]))