【问题标题】:How to add column that adds new row for each existing row如何添加为每个现有行添加新行的列
【发布时间】:2019-03-28 14:59:35
【问题描述】:

我有两个数据框,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

【问题讨论】:

  • 您能否解释一下id 列的必要性。

标签: r


【解决方案1】:

merge(df1, df2, by=NULL) 用于笛卡尔积 见这里:https://www.rdocumentation.org/packages/base/versions/3.5.3/topics/merge

【讨论】:

  • 太棒了!这正是我正在寻找的解决方案类型!谢谢!
  • @John 如果这是您问题的最佳答案,您可以将其标记为“已接受”(点击左侧上/下箭头旁边的复选标记)。这将向所有人表明您的问题已解决。
【解决方案2】:

我们可以使用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”列无关。在这种情况下,请在没有“id”列的情况下执行crossing,然后将“id”创建为row_number()

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

数据

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))

【讨论】:

    【解决方案3】:

    也许你可以使用: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
    

    【讨论】:

      猜你喜欢
      • 2023-02-08
      • 2022-07-13
      • 2012-01-04
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2021-11-01
      相关资源
      最近更新 更多