Estoy fusionando dos marcos de datos usando rbind

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

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

Me gustaría agregar una columna adicional que pueda distinguir los datos de df y df1. La salida deseada es,

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

Puedo crear manualmente una lista y usar cbind para agregar la columna a Net. Pero me gustaría pedir sugerencias sobre mejores formas de hacerlo.

r
2
Natasha 9 sep. 2018 a las 06:33

3 respuestas

La mejor respuesta

Una opción con data.table es rbindlist

library(data.table)
rbindlist(list(df, df1), idcol = 'c3')[, c3:= paste0('set', c3)][]
0
akrun 9 sep. 2018 a las 04:19

Aquí hay una forma de hacer esto en la base R (extensible para n número de marcos de datos) ...

#### 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))
1
Chaos 9 sep. 2018 a las 17:44

Puede usar bind_rows w / .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

Luego use mutate_at para cambiar el valor de las filas

Net %>% 
  mutate_at(.vars = vars(starts_with("set")), 
            .funs = funs(paste0('set', .)))

#>    set c1 c2
#> 1 set1  a  b
#> 2 set1  1  2
#> 3 set2  a  b
#> 4 set2  1  2

Creado el 2018-09-08 por el paquete reprex (v0.2.0.9000).

2
Tung 9 sep. 2018 a las 03:48