你好,我有一个如下数据框:
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相同的索引元素的“苹果”交换
我尝试了以下方法:
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")
干杯
答案 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
})