Объединение двух фреймов данных в R и добавление столбца - PullRequest
0 голосов
/ 09 сентября 2018

Я объединяю два фрейма данных, используя 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 голосов
/ 09 сентября 2018

Один вариант с data.table равен rbindlist

library(data.table)
rbindlist(list(df, df1), idcol = 'c3')[, c3:= paste0('set', c3)][]
0 голосов
/ 09 сентября 2018

Вот один из способов сделать это в базе 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))
0 голосов
/ 09 сентября 2018

Вы можете использовать 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

Затем используйте mutate_at для изменения значения строк

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

Создано в 2018-09-08 представьте пакет (v0.2.0.9000).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...