Как добавить столбец, который добавляет новую строку для каждой существующей строки - PullRequest
3 голосов
/ 28 марта 2019

У меня есть два фрейма данных, df1 и df2, и я хотел бы объединить их в форму df3, как показано ниже. Я уверен, что есть простой способ сделать это, но я не смог найти прямого решения.

df1 = data.frame(id = c(1,2), Name = c('Bob', 'Sue'), stringsAsFactors = F)
id | Name 
==========
1 |   Bob 
2 |   Sue 

df2 = data.frame(id = c(1,2,3,4), year = c(2001, 2002, 2003, 2004))
id | year
==========
1 |   2001 
2 |   2002 
3 |   2003 
4 |   2004

df3 =
id | Name | year
=================
1 |   Bob | 2001
2 |   Bob | 2002
3 |   Bob | 2003
4 |   Bob | 2004
5 |   Sue | 2001
6 |   Sue | 2002
7 |   Sue | 2003
8 |   Sue | 2004

Ответы [ 3 ]

6 голосов
/ 28 марта 2019

Используйте merge(df1, df2, by=NULL) для декартового произведения. Смотри здесь: https://www.rdocumentation.org/packages/base/versions/3.5.3/topics/merge

4 голосов
/ 28 марта 2019

Мы можем использовать crossing

library(dplyr)
library(tidyr)
crossing(df1, df2) %>%
   transmute(id = row_number(), Name, year)
#  id Name year
#1  1  Bob 2001
#2  2  Bob 2002
#3  3  Bob 2003
#4  4  Bob 2004
#5  5  Sue 2001
#6  6  Sue 2002
#7  7  Sue 2003
#8  8  Sue 2004

Кажется, столбец 'id' в выводе не имеет ничего общего с исходными столбцами 'id' в наборе данных.В этом случае, сделайте crossing без столбца 'id' и затем создайте 'id' как row_number()

crossing(df1[-1], df2[-1]) %>% 
        mutate(id = row_number())

data

df1 <- structure(list(id = 1:2, Name = c("Bob", "Sue")), 
  class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(id = 1:4, year = 2001:2004), class = "data.frame",
 row.names = c(NA, -4L))
2 голосов
/ 28 марта 2019

Возможно, вы могли бы использовать: expand.grid(Name = df1$Name, year = df2$year)

Это дает:

  Name year
1  Bob 2001
2  Sue 2001
3  Bob 2002
4  Sue 2002
5  Bob 2003
6  Sue 2003
7  Bob 2004
8  Sue 2004
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...