【问题标题】:How to make smaller table grow and match the contents of larger table in R?如何使较小的表增长并匹配 R 中较大表的内容?
【发布时间】:2020-02-28 02:04:34
【问题描述】:

我有三列。第一个很大,包含各种字母。第二个是相同的大小,但包含更少的带有一些 NA 的字母。每个字母都可以在较大的列中找到。第三列的大小也相同,但包含第二列的值和相应的 NA。

我的问题是如何使第二列和第三列重新排列,以便第二列尽可能与第一列匹配。

我觉得答案与左连接有关,但我想不通。

用文字解释有点奇怪,但例子很容易说明。

# Original Situation

Large <- c("B", "D", "C", "A", "E")
Small <- c("D", "A", NA, NA, NA)
Number <- c(5, 12, NA, NA, NA)

data.frame(Large, Small, Number)
#>   Large Small Number
#> 1     B     D      5
#> 2     D     A     12
#> 3     C  <NA>     NA
#> 4     A  <NA>     NA
#> 5     E  <NA>     NA



# I want it to finish like this:

Large <- c("B", "D", "C", "A", "E")
Small <- c(NA, "D", NA, "A", NA)
Number <- c(NA, 5, NA, 12, NA)

data.frame(Large, Small, Number)
#>   Large Small Number
#> 1     B  <NA>     NA
#> 2     D     D      5
#> 3     C  <NA>     NA
#> 4     A     A     12
#> 5     E  <NA>     NA

【问题讨论】:

  • LargeSmall 中的值是否唯一?如果不是,当有多个匹配时,期望的结果是什么?

标签: sql r sorting left-join


【解决方案1】:
library(dplyr)

# I find `tibble` generally better than `data.frame`
# If you want to use `data.frame` remember to especify stringAsFactors = FALSE
df_large <- tibble(large = Large)
df_small <- tibble(small = Small, number = Number)

left_join(df_large, df_small, by = c("large" = "small"))

如果您想同时保留 largesmall 列(我真的没有理由这样做):

left_join(df_large, df_small, by = c("large" = "small")) %>% 
  mutate(small = if_else(!is.na(number), large, NA_character_))

# A tibble: 5 x 3
  large number small
  <chr>  <dbl> <chr>
1 B         NA NA   
2 D          5 D    
3 C         NA NA   
4 A         12 A    
5 E         NA NA  

【讨论】:

    【解决方案2】:

    这是一个基本的方式:

    x <- df[1]
    y <- setNames(df[c(2, 2, 3)], names(df))
    merge(x, y, all.x = T)
    
    #   Large Small Number
    # 1     A     A     12
    # 2     B  <NA>     NA
    # 3     C  <NA>     NA
    # 4     D     D      5
    # 5     E  <NA>     NA
    

    left_join()上使用相同的逻辑:

    library(tidyverse)
    df %>%
      mutate(Large = Small) %>%
      right_join(df[1])
    
    #   Large Small Number
    # 1     B  <NA>     NA
    # 2     D     D      5
    # 3     C  <NA>     NA
    # 4     A     A     12
    # 5     E  <NA>     NA
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2016-08-26
      • 2015-01-23
      • 2012-03-20
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多