Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将两个向量组合为单独的列(或数据帧),匹配行,并在不匹配的地方使用NA的更优雅的方法_R_Dataframe_Vector_Merge_Match - Fatal编程技术网

R 将两个向量组合为单独的列(或数据帧),匹配行,并在不匹配的地方使用NA的更优雅的方法

R 将两个向量组合为单独的列(或数据帧),匹配行,并在不匹配的地方使用NA的更优雅的方法,r,dataframe,vector,merge,match,R,Dataframe,Vector,Merge,Match,我有两个相同“东西”的向量,我想组合成一个数据帧。每个向量都将成为自己的列,但它们将匹配相同的行,并在一个向量与第二个向量不匹配的地方引入NA值。由于数据仅以两个向量开始,因此除了向量值之外,没有公共id值或任何要匹配的内容 我在一个玩具数据测试中使用了一种简单而直接的方法,但是我想知道是否有一种更直接、更优雅的方法可以做到这一点 我目前的方法需要指定一个唯一的值,通过该值,我可以合并两个向量,但我很好奇,如果没有它,我是否可以这样做,而是依赖于向量值。我的其他尝试试图不采用新的id值,探索诸如

我有两个相同“东西”的向量,我想组合成一个数据帧。每个向量都将成为自己的列,但它们将匹配相同的行,并在一个向量与第二个向量不匹配的地方引入NA值。由于数据仅以两个向量开始,因此除了向量值之外,没有公共id值或任何要匹配的内容

我在一个玩具数据测试中使用了一种简单而直接的方法,但是我想知道是否有一种更直接、更优雅的方法可以做到这一点

我目前的方法需要指定一个唯一的值,通过该值,我可以合并两个向量,但我很好奇,如果没有它,我是否可以这样做,而是依赖于向量值。我的其他尝试试图不采用新的id值,探索诸如合并和联接、cbind、rbind、bind_行、bind_cols、intersect和union之类的函数。也许我没有尽可能好地使用它们。我在SO上找到了一些其他有用的帖子(如下图),但它们都是以唯一标识符开头的

这是我的玩具数据测试,最终输出是我想要的样子。最终输出是否有id列对我来说并不重要。注意,我的实际数据是字符,因此我在这里使用字母

# create toy data
x <- letters[1:5]
y <- letters[2:6]
# combine into dataframe, keep only unique values & assign id
xy <- data.frame(xy=unique(c(x,y))); xy
xy$id <- 1:length(xy$xy); xy
# match id back to original toy data as dataframes
x <- data.frame(x)
x$id <- match(x$x, xy$xy)
y <- data.frame(y)
y$id <- match(y$y, xy$xy)
# merge using id
xy2 <- merge(x, y, by="id", all=TRUE)
xy2
# results in
  id    x    y
1  1    a  <NA>
2  2    b    b
3  3    c    c
4  4    d    d
5  5    e    e
6  6 <NA>    f
#创建玩具数据

x使用
tidyverse
您可以尝试使用
full\u join
并基于两个向量创建关键点:

library(tidyverse)

full_join(data.frame(key=x, x),
          data.frame(key=y, y), by="key") %>%
  select(-key)
或者,您可以在基本R中使用
合并

merge(data.frame('key'=x, x), data.frame('key'=y, y), by='key', all=T)[-1]
cbind(x[match(unique(c(x, y)), x)], y[match(unique(c(x, y)), y)])
#>      [,1] [,2]
#> [1,] "a"  NA  
#> [2,] "b"  "b" 
#> [3,] "c"  "c" 
#> [4,] "d"  "d" 
#> [5,] "e"  "e" 
#> [6,] NA   "f" 

输出

     x    y
1    a <NA>
2    b    b
3    c    c
4    d    d
5    e    e
6 <NA>    f
xy
1A
2b
3C
四维
5 e e
6楼

这里有一个备选的R底内衬:

merge(data.frame('key'=x, x), data.frame('key'=y, y), by='key', all=T)[-1]
cbind(x[match(unique(c(x, y)), x)], y[match(unique(c(x, y)), y)])
#>      [,1] [,2]
#> [1,] "a"  NA  
#> [2,] "b"  "b" 
#> [3,] "c"  "c" 
#> [4,] "d"  "d" 
#> [5,] "e"  "e" 
#> [6,] NA   "f" 


第一个向量
x
y
是否始终具有与示例中相同的值集(即,它们是否直接匹配)?否则,我们如何知道将缺少的值放在哪里?x和y(应该)总是有一些相同的值,但肯定会有一些其他值没有的值。因此,最终输出中总会出现一些NA值。因此,我们将知道在一个向量中缺少匹配的另一个向量的位置放置缺少的值。例如,向量y没有“a”值,因此它是NA。