【问题标题】:match one observation in one data frame to every observation in another data frame without common variable将一个数据帧中的一个观察值与另一个数据帧中的每个观察值匹配,而无需公共变量
【发布时间】:2020-11-11 07:37:35
【问题描述】:

我想将 df1 中的每个值分配给 df2 中的每个值

  df1 <- data.frame(TABLE = c(1, 2, 3)) 
  
  df2 <- data.frame(PERSON = c("A", "B", "C"))

想要的输出

【问题讨论】:

  • 试试merge(df1, df2, all = TRUE)

标签: r


【解决方案1】:

一种可能的解决方案是使用expand.grid 函数,它根据所提供向量的所有组合创建一个data.frame。 为了完美匹配所需的输出,您需要放置第一人称向量,然后更改列的顺序。 (来自@allan 的评论)

df1 <- data.frame(TABLE = c(1, 2, 3))

df2 <- data.frame(PERSON = c("A", "B", "C"))

expand.grid(PERSON = df2$PERSON, TABLE = df1$TABLE)[2:1]
#>   TABLE PERSON
#> 1     1      A
#> 2     1      B
#> 3     1      C
#> 4     2      A
#> 5     2      B
#> 6     2      C
#> 7     3      A
#> 8     3      B
#> 9     3      C

【讨论】:

  • expand.grid(PERSON = df2$PERSON, TABLE = df1$TABLE)[2:1] 将完美匹配所需的输出。
【解决方案2】:

我们可以使用merge:

merge(df1, df2)

给予:

  TABLE PERSON
1     1      A
2     2      A
3     3      A
4     1      B
5     2      B
6     3      B
7     1      C
8     2      C
9     3      C

【讨论】:

    【解决方案3】:

    你也可以使用crossing:

    library(tidyr)
    
    crossing(df1,df2)
    
    # A tibble: 9 x 2
      TABLE PERSON
      <dbl> <chr> 
    1     1 A     
    2     1 B     
    3     1 C     
    4     2 A     
    5     2 B     
    6     2 C     
    7     3 A     
    8     3 B     
    9     3 C  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多