我有12个数据帧,每个包含6列:5个具有相同的名称,1个是不同的.然后,当我调用rbind()时,我得到:
Error in match.names(clabs, names(xi)) :
names do not match previous names
Run Code Online (Sandbox Code Playgroud)
不同的列是:"goal1Completions".有12个目标完成......它们是:"goal1Completions","goal2Completions","goal3Completions"......等等.
我能想到的最好方法是:将每个数据框中的每一列重命名为"GoalsCompletions",然后使用"rbind()".
有简单的方法吗?
看看谷歌我发现这个包:" gtools ".它有一个叫做"smartbind"的函数.但是,在使用smartbind()后我想看到带有"View()"的数据框,我的R会话崩溃了......
我的数据(第一个数据框的示例):
date source medium campaign goal1Completions ad.cost Goal
1 2014-10-01 (direct) (none) (not set) 0 0.0000 Vida
2 2014-10-01 Master email CAFRE 0 0.0000 Vida
3 2014-10-01 apeseg referral (not set) 0 0.0000 Vida
Run Code Online (Sandbox Code Playgroud)
Lyz*_*deR 21
我最喜欢的用途是mapply:
示例数据
a <- data.frame(a=runif(5), b=runif(5))
> a
a b
1 0.8403348 0.1579255
2 0.4759767 0.8182902
3 0.8091875 0.1080651
4 0.9846333 0.7035959
5 0.2153991 0.8744136
Run Code Online (Sandbox Code Playgroud)
和b
b <- data.frame(c=runif(5), d=runif(5))
> b
c d
1 0.7604137 0.9753853
2 0.7553924 0.1210260
3 0.7315970 0.6196829
4 0.5619395 0.1120331
5 0.5711995 0.7252631
Run Code Online (Sandbox Code Playgroud)
解
使用mapply:
> mapply(c, a,b) #or as.data.frame(mapply(c, a,b)) for a data.frame
a b
[1,] 0.8403348 0.1579255
[2,] 0.4759767 0.8182902
[3,] 0.8091875 0.1080651
[4,] 0.9846333 0.7035959
[5,] 0.2153991 0.8744136
[6,] 0.7604137 0.9753853
[7,] 0.7553924 0.1210260
[8,] 0.7315970 0.6196829
[9,] 0.5619395 0.1120331
[10,] 0.5711995 0.7252631
Run Code Online (Sandbox Code Playgroud)
并根据@ Marat的评论如下:
您也可以这样做data.frame(mapply(c, a, b, SIMPLIFY=FALSE)),或者data.frame(Map(c,a,b)) 避免双重data.frame-matrix转换
akr*_*run 11
您可以使用rbindlist哪个采用不同的列名称.使用@ LyzandeR的数据
library(data.table) #data.table_1.9.5
rbindlist(list(a,b))
# a b
# 1: 0.8403348 0.1579255
# 2: 0.4759767 0.8182902
# 3: 0.8091875 0.1080651
# 4: 0.9846333 0.7035959
# 5: 0.2153991 0.8744136
# 6: 0.7604137 0.9753853
# 7: 0.7553924 0.1210260
# 8: 0.7315970 0.6196829
# 9: 0.5619395 0.1120331
#10: 0.5711995 0.7252631
Run Code Online (Sandbox Code Playgroud)
基于12个数据集的对象名称(即'Goal1_Costo','Goal2_Costo',...,'Goal12_Costo'),
nm1 <- paste(paste0('Goal', 1:12), 'Costo', sep="_")
#or using `sprintf`
#nm1 <- sprintf('%s%d_%s', 'Goal', 1:12, 'Costo')
rbindlist(mget(nm1))
Run Code Online (Sandbox Code Playgroud)
我会重命名列.names()如果列的顺序相同,则非常容易.
df1 <- data.frame(one=1:10,two=11:20,three=21:30)
df2 <- data.frame(four=31:40,five=41:50,six=51:60)
names(df2)<-names(df1)
rbind(df1,df2)
Run Code Online (Sandbox Code Playgroud)
要么
df1 <- data.frame(one=1:10,two=11:20,three=21:30)
df2 <- data.frame(four=31:40,five=41:50,six=51:60)
rbind(df1,setnames(df2,names(df1)))
Run Code Online (Sandbox Code Playgroud)
结果:
one two three
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
5 5 15 25
6 6 16 26
7 7 17 27
8 8 18 28
9 9 19 29
10 10 20 30
11 31 41 51
12 32 42 52
13 33 43 53
14 34 44 54
15 35 45 55
16 36 46 56
17 37 47 57
18 38 48 58
19 39 49 59
20 40 50 60
Run Code Online (Sandbox Code Playgroud)