我正在使用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
。但是,我想征求有关更好的方法的建议。
答案 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)][]