我有一个data.frame,后者又包含data.frames,现在在这两个相同的集合(例如rbind(k,k)
)上使用rbind会抛出错误:
xpdrows.data.frame(x,rows,new.rows)中的错误:要处理的项目数 替换不是替换长度的倍数
下面是带有数据的对象的结构。
> 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,答案很棒。但我绊倒了一个非唯一的行名错误。现在使用nrbind()
适用于单个列或数据框,e.g. mapply(nrbind, k$location, k$location)
但在运行整个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 :(得分:3)
我花了一些时间来实际生成像你这样的“嵌套”数据框架。 就个人而言,我会避免嵌套这样的数据帧。这只是对代码的微小调整,使您能够使用R中的标准函数(参见下面的选项2)。
但是,如果您坚持使用嵌套数据框,则可以使用rbind
“模仿”mapply
的功能,其中rbind
和c
混合使用应用取决于数据帧的元素是否是数据帧本身。我为两个数据框写了一个小例子(见下面的选项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