2015-07-21 43 views
1

我有一個data.frame又包含data.frames,現在使用rbind上的兩個相同的組(例如rbind(k,k))這個數據的引發錯誤:Rbind,數據幀內有數據幀會導致錯誤?

Error in xpdrows.data.frame(x, rows, new.rows) : number of items to replace is not a multiple of replacement length

下面是與所述對象的結構數據。

> str(k) 
'data.frame': 25 obs. of 18 variables: 
$ location   :'data.frame': 25 obs. of 5 variables: 
    ..$ address :'data.frame': 25 obs. of 1 variable: 
    .. ..$ streetAddress: chr "Astrakangatan 110A" "Västmannagatan 85C" "Doktor Abelins gata 6" "Standarvägen 1" ... 
    ..$ position :'data.frame': 25 obs. of 2 variables: 
    .. ..$ latitude : num 59.4 59.3 59.3 59.3 59.3 ... 
    .. ..$ longitude: num 17.8 18 18.1 18 18 ... 
    ..$ namedAreas:List of 25 
    .. ..$ : chr "Hässelby" 
    .. ..$ : chr "Vasastan" 
    .. ..$ : chr "Södermalm" 
    .. ..$ : chr "Gamla Älvsjö" 
    .. ..$ : chr "Fruängen-Hägersten" 
    .. ..$ : chr "Södermalm" 
    .. ..$ : chr "Kungsholmen" 
    .. ..$ : chr "Fruängen" 
    .. ..$ : chr "Årsta" 
    .. ..$ : chr "Telefonplan" 
    .. ..$ : chr "Kista" 
    .. ..$ : chr "Östberga" 
    .. ..$ : chr "Hägerstensåsen" 
    .. ..$ : chr "Östermalm" 
    .. ..$ : chr "Årsta" 
    .. ..$ : chr "Bromma Blackeberg" 
    .. ..$ : chr "Similar Listings Overwritten Here" 
    .. ..$ : chr "Traneberg" 
    .. ..$ : chr "Kungsholmen" 
    .. ..$ : chr "Skärholmen" 
    .. ..$ : chr "Katarina" 
    .. ..$ : chr "Farsta stadsdelsområde" 
    .. ..$ : chr "Kista" 
    .. ..$ : chr "Bromma" 
    .. ..$ : chr "Akalla" 
    ..$ region :'data.frame': 25 obs. of 2 variables: 
    .. ..$ municipalityName: chr "Stockholm" "Stockholm" "Stockholm" "Stockholm" ... 
    .. ..$ countyName  : chr "Stockholms län" "Stockholms län" "Stockholms län" "Stockholms län" ... 
    ..$ distance :'data.frame': 25 obs. of 1 variable: 
    .. ..$ ocean: int NA 2325 1223 6360 NA 329 2630 NA 2837 5537 ... 
$ listPrice  : int 1900000 4100000 4875000 2950000 1995000 1395000 2450000 2250000 2550000 1995000 ... 
$ rent    : int 4678 1586 3092 3983 2587 520 1437 3644 2936 2707 ... 
$ floor   : num 1 1 NA 1 3 0.5 1 6 3 NA ... 
$ livingArea  : num 60 40 70 91 37 11 28 59 54 42 ... 
$ source   :'data.frame': 25 obs. of 4 variables: 
    ..$ name: chr "HusmanHagberg" "BOSTHLM" "Gripsholms Fastighetsförmedling" "Fastighetsbyrån" ... 
    ..$ id : int 1610 1499 9895524 1573 58 713 2091 1566 1566 1566 ... 
    ..$ type: chr "Broker" "Broker" "Broker" "Broker" ... 
    ..$ url : chr "http://www.husmanhagberg.se/" "http://www.bosthlm.se/" "http://gripsholms.se/" "http://www.fastighetsbyran.se/" ... 
$ rooms   : num 2 2 2.5 3.5 2 1 1 2 2 2 ... 
$ published  : Date, format: "2015-07-17" "2015-07-16" "2015-07-15" "2015-07-10" ... 
$ constructionYear : int 2006 NA 1929 1937 NA 1929 1930 2014 1949 1944 ... 
$ objectType  : chr "Lägenhet" "Lägenhet" "Lägenhet" "Lägenhet" ... 
$ booliId   : int 1920703 1919949 1896584 1917520 1918145 1918049 1917638 1849399 1916805 1826479 ... 
$ soldDate   : Date, format: "2015-07-21" "2015-07-19" "2015-07-20" "2015-07-20" ... 
$ soldPrice  : int 2000000 4100000 5175000 4200000 2500000 1850000 2820000 2600000 2900000 2230000 ... 
$ url    : chr "https://www.booli.se/bostad/lagenhet/hasselby/astrakangatan+110a/1920703" "https://www.booli.se/bostad/lagenhet/vasastan/vastmannagatan+85c/1919949" "https://www.booli.se/bostad/lagenhet/sodermalm/doktor+abelins+gata+6/1896584" "https://www.booli.se/bostad/lagenhet/gamla+alvsjo/standarvagen+1/1917520" ... 
$ isNewConstruction: int NA NA NA NA NA NA NA NA NA NA ... 
$ plotArea   : int NA NA NA NA 0 NA NA NA NA NA ... 
$ AreaSize   : Factor w/ 10 levels "10","20","30",..: 6 4 7 9 3 1 2 5 5 4 ... 
$ PriceDiff  : int 100000 0 300000 1250000 505000 455000 370000 350000 350000 235000 ... 

正在數據幀內使用數據幀生病嗎?還是我犯了一個錯誤?

@SimonG,Answer很好。但是我絆倒了一個非唯一的行名錯誤。現在使用nrbind()適用於單個列或數據框,但運行整個data.frame時不會運行。即使我用row.names更改了rownames,它仍會拋出錯誤。

> nrbind <- function(x,y) if(is.data.frame(x)) rbind(x,y) else c(x,y) 
> as.data.frame(mapply(nrbind, k, k)) 
Show Traceback 

Rerun with Debug 
Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
    duplicate 'row.names' are not allowed In addition: Warning message: 
non-unique values when setting 'row.names': ‘1’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’, ‘16’, ‘17’, ‘18’, ‘19’, ‘2’, ‘20’, ‘21’, ‘22’, ‘23’, ‘24’, ‘25’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 
+0

我只看到你的數據框包含多層嵌套。我已在下面更新了我的答案。 – SimonG

回答

2

我花了一段時間才真正產生一個像你一樣的「嵌套」數據框。個人而言,我會避免像這樣嵌套數據框。這只是對代碼的小調整,使您能夠使用R中的標準函數(請參見下面的選項2)。

但是,如果堅持具有嵌套的數據幀,則可以「模擬」的rbind功能使用mapply,其中的rbindc一個混合物根據數據幀中的元素是否是數據幀本身施用。我爲兩個數據框寫了一個小例子(參見下面的選項1)。

選項1:嵌套

a <- letters[1:5] 
xy <- data.frame(x=1:5, y=5:1) 

k <- data.frame(a) 
k[["xy"]] <- xy 

# 'data.frame': 5 obs. of 2 variables: 
# $ a : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 
# $ xy:'data.frame':  5 obs. of 2 variables: 
# ..$ x: int 1 2 3 4 5 
# ..$ y: int 5 4 3 2 1 

nrbind <- function(x,y) if(is.data.frame(x)) rbind(x,y) else c(x,y) 
as.data.frame(mapply(nrbind, k, k)) 

# a xy.x xy.y 
# 1 1 1 5 
# 2 2 2 4 
# 3 3 3 3 
# 4 4 4 2 
# 5 5 5 1 
# 6 1 1 5 
# 7 2 2 4 
# 8 3 3 3 
# 9 4 4 2 
# 10 5 5 1 

注單級,上面的功能nrbind真的是 「快速和骯髒」。但是,調整它以適應您的需求應該很簡單。請注意,mapply的結果不再是嵌套數據幀。因此,爲了重複使用選項1,您必須擴展功能nrbind而不是重複運行mapply

選項2:重新定義爲常規data.frame

k <- data.frame(a=a, xy=xy) 

# 'data.frame': 5 obs. of 3 variables: 
# $ a : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 
# $ xy.x: int 1 2 3 4 5 
# $ xy.y: int 5 4 3 2 1 

rbind(k, k) # result as above 

使用常規數據幀將是這樣做的我的首選方式。

[編輯:]選3:嵌套

更高水平本來,我沒看到你的數據幀竟是嵌套多次。上述兩個選項僅適用於單層嵌套或根本不嵌套。

嵌套的多層次可以通過使整個事物遞歸來解決。

b <- data.frame(a) 
b[["z"]] <- data.frame(z1=1:5, z2=5:1) 
k <- data.frame(a) 
k[["b"]] <- b; k[["xy"]] <- xy 

# 'data.frame': 5 obs. of 3 variables: 
# $ a : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 
# $ b :'data.frame':  5 obs. of 2 variables: 
# ..$ a: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 
# ..$ z:'data.frame': 5 obs. of 2 variables: 
# .. ..$ z1: int 1 2 3 4 5 
# .. ..$ z2: int 5 4 3 2 1 
# $ xy:'data.frame':  5 obs. of 2 variables: 
# ..$ x: int 1 2 3 4 5 
# ..$ y: int 5 4 3 2 1 

recursive.rbind <- function(x,y){ 
    ll <- lapply(seq_along(x), function(i){ 
    if(is.data.frame(x[[i]])) nrbind(x[[i]],y[[i]]) else rbind(x[i],y[i]) 
    }) 
    names(ll) <- names(x) 
    as.data.frame(ll) 
} 

recursive.rbind(k,k) 

# a b.a b.z.z1 b.z.z2 xy.x xy.y 
# 1 a a  1  5 1 5 
# 2 b b  2  4 2 4 
# 3 c c  3  3 3 3 
# 4 d d  4  2 4 2 
# 5 e e  5  1 5 1 
# 6 a a  1  5 1 5 
# 7 b b  2  4 2 4 
# 8 c c  3  3 3 3 
# 9 d d  4  2 4 2 
# 10 e e  5  1 5 1 
+0

非常感謝! – uncool

+1

不客氣。請記住接受答案,如果它解決了你的問題(除非當然有人提供更好的答案!):) – SimonG

+0

一個小問題已經出現;)當使用你的選項二與mapply。我得到一個非唯一的行名錯誤。現在我的rownames都會一樣。你知道任何直接的解決方案嗎?在運行代碼之前清除行名稱時也會發生這種情況(row.names(k)< - NULL) – uncool