R rbind 数据帧的数据帧
R rbind a dataframe of dataframes
如何连接包含一个或多个 data.frames 列的数据框。例如:
df <- data.frame(a=1:3)
df$df <- data.frame(a=1:3)
rbind( df, df)
Error in row.names<-.data.frame
(*tmp*
, value = value) :
duplicate 'row.names' are not allowed In addition: Warning message:
non-unique values when setting 'row.names': ‘1’, ‘2’, ‘3’
library(dplyr)
bind_rows(list(df,df))
Error: Argument 2 can't be a list containing data frames
一个选择是 rep
licate df
两次(或更多)而不是 rbind
-ing 它;这将自动创建非重复的 row.names
。试试这个:
df[rep(seq_len(nrow(df)), 2), ]
# output
a a
1 1 1
2 2 2
3 3 3
1.1 1 1
2.1 2 2
3.1 3 3
同样的过程使用dplyr
会让你更有趣row.names
:
library(dplyr)
df %>% slice(rep(row_number(), 2))
# output
a a
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
这里的问题似乎不是数据框中的另一个 data.frame
,而是结果中的 non-unique rownames
。如果您确保行名在 rbind 之后是唯一的 - 它应该可以工作:
df1 <- data.frame(a=1:3)
df2 <- data.frame(a=1:3)
df1$df <- data.frame(a=1:3, row.names=letters[1:3])
df2$df <- data.frame(a=1:3, row.names=LETTERS[1:3])
> res <- rbind(df1, df2)
> res
a a
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
> res$df
a
a 1
b 2
c 3
A 1
B 2
C 3
问题似乎是 rbind
调整了合并的两个 data.frames 的行名,但没有调整 data.frames 中的 data.frames 的行名。
我们可以 list
数据框,然后使用 mapply
以不同方式处理列类型:stack
用于向量,do.call(rbind)
用于 data.frame
。
L <- mget(ls(pattern="df\.")) # or list(df.1, df.2, df.3)
res <- data.frame(a=stack(mapply(`[`, L, 1))[[1]])
res$df <- do.call(rbind, mapply(`[`, L, 2))
res
# a a
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# 6 6 6
# 7 7 7
# 8 8 8
# 9 9 9
str(res)
# 'data.frame': 9 obs. of 2 variables:
# $ a : int 1 2 3 4 5 6 7 8 9
# $ df:'data.frame': 9 obs. of 1 variable:
# ..$ a: int 1 2 3 4 5 6 7 8 9
数据
df.1 <- structure(list(a = 1:3, df = structure(list(a = 1:3), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")
df.2 <- structure(list(a = 4:6, df = structure(list(a = 4:6), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")
df.3 <- structure(list(a = 7:9, df = structure(list(a = 7:9), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")
如何连接包含一个或多个 data.frames 列的数据框。例如:
df <- data.frame(a=1:3)
df$df <- data.frame(a=1:3)
rbind( df, df)
Error in
row.names<-.data.frame
(*tmp*
, value = value) :
duplicate 'row.names' are not allowed In addition: Warning message: non-unique values when setting 'row.names': ‘1’, ‘2’, ‘3’
library(dplyr)
bind_rows(list(df,df))
Error: Argument 2 can't be a list containing data frames
一个选择是 rep
licate df
两次(或更多)而不是 rbind
-ing 它;这将自动创建非重复的 row.names
。试试这个:
df[rep(seq_len(nrow(df)), 2), ]
# output
a a
1 1 1
2 2 2
3 3 3
1.1 1 1
2.1 2 2
3.1 3 3
同样的过程使用dplyr
会让你更有趣row.names
:
library(dplyr)
df %>% slice(rep(row_number(), 2))
# output
a a
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
这里的问题似乎不是数据框中的另一个 data.frame
,而是结果中的 non-unique rownames
。如果您确保行名在 rbind 之后是唯一的 - 它应该可以工作:
df1 <- data.frame(a=1:3)
df2 <- data.frame(a=1:3)
df1$df <- data.frame(a=1:3, row.names=letters[1:3])
df2$df <- data.frame(a=1:3, row.names=LETTERS[1:3])
> res <- rbind(df1, df2)
> res
a a
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
> res$df
a
a 1
b 2
c 3
A 1
B 2
C 3
问题似乎是 rbind
调整了合并的两个 data.frames 的行名,但没有调整 data.frames 中的 data.frames 的行名。
我们可以 list
数据框,然后使用 mapply
以不同方式处理列类型:stack
用于向量,do.call(rbind)
用于 data.frame
。
L <- mget(ls(pattern="df\.")) # or list(df.1, df.2, df.3)
res <- data.frame(a=stack(mapply(`[`, L, 1))[[1]])
res$df <- do.call(rbind, mapply(`[`, L, 2))
res
# a a
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
# 5 5 5
# 6 6 6
# 7 7 7
# 8 8 8
# 9 9 9
str(res)
# 'data.frame': 9 obs. of 2 variables:
# $ a : int 1 2 3 4 5 6 7 8 9
# $ df:'data.frame': 9 obs. of 1 variable:
# ..$ a: int 1 2 3 4 5 6 7 8 9
数据
df.1 <- structure(list(a = 1:3, df = structure(list(a = 1:3), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")
df.2 <- structure(list(a = 4:6, df = structure(list(a = 4:6), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")
df.3 <- structure(list(a = 7:9, df = structure(list(a = 7:9), class = "data.frame", row.names = c(NA,
-3L))), row.names = c(NA, -3L), class = "data.frame")