Условно заменить элемент списка в rstudio - PullRequest
0 голосов
/ 08 июля 2019

Здравствуйте, у меня есть датафрейм, как показано ниже:

 path.vec                           source.vec                        
1 apple                             Tuesday                        
2 lemon                             Monday                         
3 orange                            Wednesday                          
4c("apple", "lemon", "grape")       c("Friday", "Monday", "Sunday")     
5c("cheery", "lemon", "grape")      c("Saturday", "Monday", "Sunday")      
6c("apple", "lemon", "apple")       c("Thursday", "Monday", "Sunday")   

только 2 переменные: path.vec и source.vec. Оба собирают 2 разные тени одинаковых данных

enter image description here

Я хотел бы просто поменять местами элементы между списками с одинаковым индексом при выполнении условия.

Соотношение должно быть:

если df $ path.vec содержит «яблочный» своп с df $ source.vec с тем же элементом индекса

Я попробовал следующее:

df$path.vec <- ifelse(grepl("apple", df$path.vec), df$source.vec, df$path.vec)

но это меняет все элементы, когда есть хотя бы один элемент == "apple", а я хочу изменить только элемент "apple". Я думаю, что, вероятно, мне нужно сначала найти индексы, а потом основывать свой своп на индексе? Я пробовал

ind  <- which(df$path.vec %in% c("apple"))

но в моем реальном наборе данных это ошибка

Error in `$<-.data.frame`(`*tmp*`, path.index, value = 1:6) : 
 replacement has 6 rows, data has 33422

потому что он индексируется только тогда, когда яблоко является единственным элементом списка.

я тоже пробовал

df$path.index <- match("apple", df$path.vec)

но это приводит только к 1 каждой строке моего фрейма данных.

Это лучший способ подойти к этому?

В конце концов я хотел бы получить еще один столбец, как показано ниже:

path.final                                               
1 Tuesday                                                          
2 lemon                                                      
3 orange                                                
4c("Friday", "lemon", "grape")        
5c("cheery", "lemon", "grape")     
6c("Thursday", "lemon", "Sunday")

Приветствия

1 Ответ

0 голосов
/ 10 июля 2019

Я решил это следующим образом:

Как только списки имеют имена:

names(path.vec) <- c(1:6)

path.final <- lapply(1:length(path.vec), function(x) {
res <- path.vec[[x]]
pos <- grep("apple", res, fixed = T)
if(length(pos) > 0) res[pos]  <- source.vec[[x]][pos]
res
})
...