这可能是重复的,但我似乎没有找到这个特定的案例。
假设我有两个列表:
list1 <- as.list(c(5, 8, 9))
list2 <- as.list(c(8, 10, 11))
我知道如何将函数应用于一个列表。假设我想将以下内容应用于list1
:
lapply(list1, function(x){x+100})
但如果我只想在 中的对应值为 时应用此类函数,该怎么办?list1
这样我的结果是:list2
>=10
[[1]]
[1] 5
[[2]]
[1] 108
[[3]]
[1] 109
甚至更多,我怎样才能将 100 与 中的值相加,并仅当 中的值为 时才减去list1
中的值?list2
list2
>=10
类似下面的代码显然是行不通的:
lapply(list1, list2, function(x,y){if (y>=10) x+100-y})
谢谢!
我认为您正在寻找未经简化
Map()
的mapply()
:出于我想象只有 R 开发人员知道的原因,与 和 不同
lapply()
,sapply()
该tapply()
函数是mapply()
和 的第一个参数Map()
。如果您想要更花哨一点,您可以删除该
if()
语句并将该函数定义为,\(x1, x2) x1 + 100 * (x2 >= 10)
但我个人认为缺乏明确性会使其不太容易理解。当然,
ifelse(list2 >= 10, unlist(list1) + 100, list1)
在这种情况下你也可以这样做,但是Map()
这种方法更为通用。您的第二个例子可以表达为
Map(\(x, y) if (y >= 10) x + 100 - y else x, list1, list2)
。鉴于这个小例子,我不明白为什么我们要使用列表格式。如果我们使用向量,事情会变得更容易:
然后应用完全矢量化的
注意。注释取自用户@SamR 的解决方案。
使用的一种变体
Map