2016-10-14 161 views
1

我有2個向量從一個矢量刪除另一個向量的所有元素中的R

vec_1 
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 2 3 4 5 6 7 8 9 10 11 12 13 14 2 3 4 5 6 7 8 9 
[35] 10 11 12 13 14 2 3 4 5 6 7 8 9 10 11 12 13 14 

vec_2 
[1] 12 3 13 3 14 4 10 8 9 5 7 5 13 11 6 10 8 8 14 12 6 11 8 5 3 6 

我想從vec_1 並確保刪除vec_2所有元素,該函數setdiff情況並非如此,因爲,例如,在vec_2中有兩個10的值。我只想刪除10個(不是全部四個值都是10)。

編輯:預期輸出:

vec_1 
[1] 2 2 2 2 3 4 4 4 5 6 7 7 7 9 9 9 10 10 11 11 12 12 13 13 14 14 

我怎樣才能做到這一點r中?

+1

您可以顯示預期輸出。另外,請使用'dput'來顯示矢量 – akrun

回答

2

這裏是一個想法通過union

unlist(sapply(union(vec_1, vec_2), function(i) 
        rep(i, each = length(vec_1[vec_1 == i]) - length(vec_2[vec_2 == i])))) 
#[1] 2 2 2 2 3 4 4 4 5 6 7 7 7 9 9 9 10 10 11 11 12 12 13 13 14 14 
1

您可以使用一個簡單的for循環做到這一點:

for(i in 1:length(vec2)){ 
    i=which(vec1 %in% vec2[i])[1] 
    vec1=vec1[-i] 
} 

你只識別第一個位置,並從原來的載體中刪除。

2

絕對不是最好的解決方案,但這裏是一種方法。

我創建了一個簡化的例子。

vec1 <- c(1, 2, 3, 1, 1, 5) 
vec2 <- c(1, 3, 5) 

#Converting the frequency table to a data frame 
x1 <- data.frame(table(vec1)) 
x2 <- data.frame(table(vec2)) 

#Assuming your vec1 has all the elements present in vec2 
new_df <- merge(x1, x2, by.x = "vec1", by.y = "vec2", all.x = TRUE) 
new_df 

# vec1 Freq.x Freq.y 
#1 1  3  1 
#2 2  1  NA 
#3 3  1  1 
#4 5  1  1 

#Replacing NA's by 0 

new_df[is.na(new_df)] <- 0 

#Subtracting the frequencies of common elements in two vectors 
final <- cbind(new_df[1], new_df[2] - new_df[3]) 
final 

# vec1 Freq.x 
#1 1  2 
#2 2  1 
#3 3  0 
#4 5  0 

#Recreating a new vector based on the final dataframe 

rep(final$vec1, times = final$Freq.x) 
# [1] 1 1 2 
0

你可以試試這個太:

for (el in vec2[vec2 %in% intersect(vec1, vec2)]) 
    vec1 <- vec1[-which(vec1==el)[1]] 
sort(vec1) 
#[1] 2 2 2 2 3 4 4 4 5 6 7 7 7 9 9 9 10 10 11 11 12 12 13 13 14 14 
相關問題