R:具有不同列名的rbind数据帧

Oma*_*les 16 r

我有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转换

  • 您可以通过`data.frame(mapply(c, a, b, SIMPLIFY=FALSE))`或`data.frame(Map(c,a,b))`来避免双重data.frame-matrix转换 (4认同)

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)

  • dplyr有没有类似的功能?我很想看,如果有人知道请发帖. (2认同)
  • @OmarGonzales 它有`bind_rows`,但列名仍然是一个问题。因此,输出将不是 2 列,而是 4。根据`?bind_rows``当行绑定时,列按名称匹配,任何不匹配的值将用 NA 填充。` (2认同)

Set*_*thB 6

我会重命名列.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)