我有两个长度相同的向量。这是一个包含四行的简单示例:
[1] green
[2] black, yellow
[3] orange, white, purple
[4] NA
[1] red
[2] black
[3] NA
[4] blue
第一个或第二个向量中可以有NA,但在每一行中至少有一个总是有一个值。第一个矢量可以包含一个或多个值,而第二个矢量只能包含一个。 我希望“有选择地”逐行地连接这两个向量,输出方式如下:
[1] green, red
[2] black, yellow
[3] orange, white, purple
[4] blue
这意味着第一个向量的内容必须始终存在于输出中。如果第一个向量的行中有NA,则它将被第二个向量的同一行中的值覆盖。
如果该值不在第一个矢量的同一行中,则将添加第二个矢量的内容。第二个向量中的NA将被忽略。
我试过了:
merge(A,B)
merge(A, B, all=TRUE)
merge(A, B, all.x=TRUE)
merge(A, B, all.y=TRUE)
但他们都会产生完全不同的结果。
如何实现上述“选择性”加入?
非常感谢您的考虑!
答案 0 :(得分:3)
你基本上是想做一个“联盟,然后扔掉任何NAs”,那么这个单线程怎么样?
A = list( 'green', c('black', 'yellow'), c('orange', 'white', 'purple'), NA)
B = list( 'red', 'black', NA, 'blue')
> sapply(mapply(union, A,B), setdiff, NA)
[[1]]
[1] "green" "red"
[[2]]
[1] "black" "yellow"
[[3]]
[1] "orange" "white" "purple"
[[4]]
[1] "blue"
答案 1 :(得分:2)
我不确定你是如何将这些数据输入到data.frame
中的,但是如果你将数据放入2个列表中,那么我可以看到一种方法。以下是我的尝试(以下评论建议):
# get the data
a <- c("green","black, yellow","orange, white, purple",NA)
b <- c("red","black",NA,"blue");
# strip any spaces first
a <- gsub("[[:space:]]+","",a)
b <- gsub("[[:space:]]+","",b)
# convert to lists
alist <- strsplit(a,",")
blist <- strsplit(b,",")
# join the lists
abjoin <- mapply(c,alist,blist)
# remove any duplicates and NA's
abjoin <- lapply(abjoin,function(x) (unique(x[complete.cases(x)])))
# result
> abjoin
[[1]]
[1] "green" "red"
[[2]]
[1] "black" "yellow"
[[3]]
[1] "orange" "white" "purple"
[[4]]
[1] "blue"
要转换为矢量,每个颜色集用逗号分隔:
sapply(abjoin,paste,collapse=",")
#[1] "green,red" "black,yellow" "orange,white,purple"
#[4] "blue"