[英]In R how can you replace elements in a long list while preserving the original list structure?
我需要在保留原始結構的同時替換列表中的每個值。 我有一個向量。 我需要在向量中找到大於或等於列表中每個值的最小值。 然后用該最小值替換列表中的值。 該列表足夠長,以至於循環將不起作用。 有什么方法可以使用Apply或相關功能嗎?
a <- list(x = 1, y = c(2,3), z = 5)
b <- c(1,2,4,6,7)
> a
$x
[1] 1
$y
[1] 2 3
$z
[1] 5
我想產生的是這樣的修改版本
> a
$x
[1] 1
$y
[1] 2 4
$z
[1] 6
使用lapply我可以接近
> lapply(unlist(a), function(x) min(b[b>=x]))
$x
[1] 1
$y1
[1] 2
$y2
[1] 4
$z
[1] 6
但是結構不再保留,因為現在有了$y1
和$y2
而不是只有兩個元素的$y
。
relist()
將矢量“肉”包裹在列表“骨架”的形狀周圍。 因此,請使用unlist(unname(a))
來獲取值的向量(不帶名稱,如在示例中所看到的那樣,它們是無意義的且構建起來很昂貴)。 將您的條件應用於每個元素(使用vapply()
,比您的lapply嚴格一點),然后使用relist()
恢復原始形狀
v = unlist(unname(a))
result = vapply(v, function(x, b) min(b[b>=x]), numeric(1), b)
relist(result, a)
vapply()
仍然循環。 更快的版本是使用findInterval()
,類似於
i = findInterval(v, b)
result = ifelse(b[i] == v, b[i], b[i + 1])
這要求b
被排序(可能我沒有正確的終點)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.