【问题标题】:Conditional replace a list element in rstudio有条件地替换 rstudio 中的列表元素
【发布时间】:2019-07-08 15:02:19
【问题描述】:

您好,我有一个如下所示的数据框:

 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 个不同阴影

我只想在满足条件时在具有相同索引的列表之间交换元素。

比例应该是:

如果 df$path.vec 包含与 df$source.vec 相同索引元素的“apple”交换

我尝试了以下方法:

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

因为它只是在 apple 是列表中唯一的元素时才进行索引。

我也试过了

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

干杯,

【问题讨论】:

    标签: vector indexing replace match rstudio


    【解决方案1】:

    我已经解决了这个问题:

    一旦列表有了名字:

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

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2017-08-02
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多