合并R中的两个数据帧并追加一列

时间:2018-09-09 03:33:43

标签: r

我正在使用rbind合并两个数据帧

 c1 <- c("a",1)
 c2 <- c("b",2)
 df <- data.frame(c1,c2)

 df1 <- data.frame(c1,c2)
 Net <- rbind(df,df1)

我想添加一个附加列,以区分df和df1中的数据。 所需的输出是

 > Net
  c1 c2  c3
1  a  b  set1
2  1  2  set1
3  a  b  set2
4  1  2  set2

我可以手动创建一个列表,并使用cbind将列追加到Net。但是,我想征求有关更好的方法的建议。

3 个答案:

答案 0 :(得分:2)

您可以使用带有bind_rows的{​​{1}}

.id =

然后使用library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union c1 <- c("a",1) c2 <- c("b",2) df <- data.frame(c1, c2) df1 <- data.frame(c1, c2) Net <- bind_rows(df, df1, .id = 'set') Net #> set c1 c2 #> 1 1 a b #> 2 1 1 2 #> 3 2 a b #> 4 2 1 2 更改行值

mutate_at

reprex package(v0.2.0.9000)创建于2018-09-08。

答案 1 :(得分:1)

这是在基数R中进行此操作的一种方法(可扩展为n个数据帧)...

#### Create data ####
# Create data frames
df1 <- data.frame(c1 = c(1:5), c2 = c(5:1))
df2 <- data.frame(c1 = c(6:10), c2 = c(10:6))

# Create a list of data frames
df_list <- list(df1, df2)

# Create set-mapping (df1 == set1 etc)
df_set <- list('set1', 'set2')


#### Concatenate all data frames into 1 data frame ####
df_result <- df_list %>% Map(function(df, set_name) { 
    # For each dataframe, we add the corresponding set identifier
    df$c3 <- set_name 
    return(df)}, ., df_set) %>% 
    # Loop through list and rbind each encountered dataframe
    Reduce(function(df_1, df_2) rbind(df_1, df_2))

答案 2 :(得分:0)

带有data.table的一个选项是rbindlist

library(data.table)
rbindlist(list(df, df1), idcol = 'c3')[, c3:= paste0('set', c3)][]