2016-10-14 5 views
1

У меня есть 2 векторовОт одного вектора удалить все элементы другого вектора г

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_2 от vec_1 И убедитесь, что функция setdiff это не так, потому что, Например, в vec_2 есть два значения 10s. И я хочу удалить только до 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 

Как я могу это сделать в г?

+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(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 
Смежные вопросы