Rbind фреймы данных со столбцами фреймов данных - PullRequest
1 голос
/ 18 апреля 2020

Я хотел бы иметь возможность rbind фреймов данных, у которых есть столбцы, которые data.frame сами (не списки фреймов данных).

df <- data.frame(a = 1)
df$b <- data.frame(c = 2)
str(df)
# 'data.frame': 1 obs. of  2 variables:
#  $ a: num 1
#  $ b:'data.frame':    1 obs. of  1 variable:
#   ..$ c: num 2

df2 <- data.frame(a = 3)
df2$b <- data.frame(c = 4)

rbind(df, df2)

# Error in `.rowNamesDF<-`(x, value = value) : 
#   duplicate 'row.names' are not allowed
# In addition: Warning message:
# non-unique value when setting 'row.names': ‘1’ 

Мне известно о dplyr::bind_rows(df, df), но Я бы специально потребовал решение base R .
(я быстро взглянул на то, как это делает bind_rows, но, насколько я могу судить, оно относится к C code в vctrs::vec_rbind, что для меня непроницаемо.)

expected_output <- data.frame(a = c(1, 3))
expected_output$b <- data.frame(c = c(2, 4))
str(expected_output)
# 'data.frame': 2 obs. of  2 variables:
#  $ a: num  1 3
#  $ b:'data.frame':    2 obs. of  1 variable:
#   ..$ c: num  2 4

(Контекст: такие кадры данных поступают из вызовов API, проанализированных с jsonlite с упрощением. Хотя Я мог бы избежать этого, я ценю удобство, и мне любопытно об этой проблеме, независимо от того).

Ответы [ 3 ]

4 голосов
/ 18 апреля 2020

Вы также можете использовать unlist ()

rbind(df, unlist(df2))
#   a c
# 1 1 2
# 2 3 4

Примечание. При этом маршруте оба входа должны иметь одинаковое количество столбцов в том же значимом порядке.

1 голос
/ 18 апреля 2020

Попробуйте

df[rep(1:nrow(df), 2),]

Однако при необходимости вам может потребоваться переименовать имена строк.

0 голосов
/ 18 апреля 2020

Мы можем использовать bind_rows (используется версия devel dplyr

library(dplyr)
out <- bind_rows(df, df2)
out
#  a c
#1 1 2
#2 3 4

str(out)
#'data.frame':  2 obs. of  2 variables:
#$ a: num  1 3
#$ b:'data.frame':  2 obs. of  1 variable:
#  ..$ c: num  2 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...