簡體   English   中英

在R中,如何在保留原始列表結構的同時替換長列表中的元素?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM