如何根据其中一个列扩展data.frame?

时间:2018-05-04 05:02:03

标签: r dataframe match

优雅的方式(没有额外的套餐)以及#34;扩展"根据其中一个列的给定data.frame

假设:

df  <- data.frame(values = 1:5, strings = c("e", "g", "h", "b", "c"))
more.strings <- letters[c(3, 5, 7, 1, 4, 8, 6)]

期望的结果:data.frame包含:

5  c
1  e
2  g
NA a
NA d
3  h
NA f

因此df$strings中出现的more.strings值应该用于填充新的data.frame(否则为NA)。

2 个答案:

答案 0 :(得分:2)

你可以join

在基地R你可以这样做:

merge(df, more.strings, by.y="y",by.x="strings", all.y=TRUE)
 strings values
1       c      5
2       e      1
3       g      2
4       h      3
5       a     NA
6       d     NA
7       f     NA   

或者@thelatemailin在下面的评论部分给出:

 merge(df, list(strings=more.strings),by="strings", all.y=TRUE)

使用库:

library(tidyverse)
right_join(df,data.frame(strings=more.strings),by="strings")
  values strings
1      5       c
2      1       e
3      2       g
4     NA       a
5     NA       d
6      3       h
7     NA       f

答案 1 :(得分:1)

我们可以在不使用任何库的情况下执行此操作,即仅使用base R

data.frame(value = with(df, match(more.strings, strings)), 
        strings = more.strings)
#    value strings
#1     5       c
#2     1       e
#3     2       g
#4    NA       a
#5    NA       d
#6     3       h
#7    NA       f

或者我们可以使用complete

library(tidyverse)
complete(df, strings = more.strings) %>% 
     arrange(match(strings, more.strings)) %>%
     select(names(df))
# A tibble: 7 x 2
#  values strings
#   <int> <chr>  
#1      5 c      
#2      1 e      
#3      2 g      
#4     NA a      
#5     NA d      
#6      3 h      
#7     NA f