Как сделать так, чтобы таблица меньшего размера росла и соответствовала содержимому таблицы большего размера в R? - PullRequest
1 голос
/ 01 ноября 2019

У меня есть три столбца. Первый большой и содержит различные буквы. Второй имеет тот же размер, но содержит меньше букв с некоторыми 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

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вот базовый способ:

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
1 голос
/ 01 ноября 2019
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"))

Если вы хотите сохранить оба столбца large и small (я не вижу причины для этого):

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