有条件地替换rstudio中的列表元素

时间:2019-07-08 15:02:19

标签: vector indexing replace match rstudio

你好,我有一个如下数据框:

 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 :(得分:0)

我已经解决了以下问题:

一旦列表中有名字:

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
})