我有兩個串列物件。l1包含已通過路徑檔案讀入的資訊。l2是與 中的具有相似名稱組件的值的串列l1。我已經根據串列中元素的名稱為這兩個串列分配了屬性。我想使用我分配給我的串列的屬性來達到我的預期結果。
例如:我想在具有“2013_mean”mean()屬性的元素之間應用一個函式到那些具有“2013”??屬性的元素之間。當年份的屬性為“2016”時,我想對那些做類似的事情。idl1yearl2
# File List
l1 <- list(2,3,4,5)
names(l1) <- c("C:/Users/2013_mean.csv",
"C:/Users/2013_median.csv",
"C:/Users/2016_mean.csv",
"C:/Users/2016_median.csv")
attributes(l1) <- data.frame(id = sub("\\.csv", "", basename(names(l1))),
year = trimws(basename(names(l1)), whitespace = "_.*"))
# Other List
l2 <- list(8,9,10,15,1)
names(l2) <- c("2013_A",
"2013_B",
"2013_C",
"2016_D",
"2016_E")
attributes(l2) <- data.frame(year = trimws(names(l2), whitespace = "_.*"))
expected <- list(mean(c(l1[[1]], l2[[1]])),
mean(c(l1[[1]], l2[[2]])),
mean(c(l1[[1]], l2[[3]])),
mean(c(l1[[3]], l2[[4]])),
mean(c(l1[[3]], l2[[5]]))
)
uj5u.com熱心網友回復:
我們可以使用屬性進行拆分和匹配并獲得均值
i1 <- grepl("mean", attr(l1, "id"))
l1new <- l1[i1]
attr(l1new, "year") <- attr(l1, "year")[i1]
out <- do.call(c, Map(function(x, y) lapply(x, function(z)
mean(c(z, y))), split(l2, attr(l2, 'year')), l1new))
names(out) <- NULL
-檢查OP的預期
> identical(out, expected)
[1] TRUE
或者另一種選擇是將listwith 屬性轉換為 data.frame,執行 amerge并使用rowMeans,然后轉換為listwithas.list
as.list(rowMeans(merge(transform(data.frame(attributes(l2)),
l2 = unlist(l2)),
subset(transform(data.frame(attributes(l1)), l1 = unlist(l1)),
grepl("mean", id), select = c(year, l1)), all.x = TRUE)[-1]))
-輸出
[[1]]
[1] 5
[[2]]
[1] 5.5
[[3]]
[1] 6
[[4]]
[1] 9.5
[[5]]
[1] 2.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/450208.html
