簡體   English   中英

添加基於特定 function 的列,在列表中的列表上使用 (l)apply 或 purr?

[英]Adding columns based on a specific function with (l)apply or purr on lists in a list?

我想在列表中的所有列表中添加基於 function 的列。

list1 <- list(A = c(1:10), B = c(rnorm(1:10)), C = c(rnorm(1:10)), D = c(rnorm(1:10)))
list2 <- list(A = c(1:10), B = c(rnorm(1:10)), C = c(rnorm(1:10)), D = c(rnorm(1:10)))
both_lists <- list(list1,list2)
both_lists <- lapply(both_lists, function(x) ... )

對於一個 dataframe (不在列表中)我通常使用:

df1 <- data.frame(A = c(1:10), B = c(rnorm(1:10)), C = c(rnorm(1:10)), D = c(rnorm(1:10)))
df2 <- data.frame(A = c(1:10), B = c(rnorm(1:10)), C = c(rnorm(1:10)), D = c(rnorm(1:10)))
df1 %>% mutate(max = do.call(pmax, c(select(., c(2:4)))))

但是我該如何為列表中的列表*執行此操作? 所以我想對列表中的所有列表做兩件事:

  • 找到第 2-4 列的最大值
  • 將該最大值添加為單獨的行

哦,還有誰能告訴我我實際上是如何更改列表中的列表名稱的? (所以將 list1 的名稱更改為集合中行名稱的名稱?EG 將列表的名稱設置為df1[[1]][1]並用 lapply 對列表中的每個列表重復此操作?

使用lapply你可以這樣做:

lapply(both_lists, function(x){x[['max']] <- do.call(pmax, x[2:4]); x})

output 看起來像這樣:

[[1]]
[[1]]$A
 [1]  1  2  3  4  5  6  7  8  9 10

[[1]]$B
 [1]  1.325128799  0.341702207  0.341139152 -0.630065889  0.799934566  0.427531770
 [7] -1.492861023  2.643621022  0.008158055 -0.187956774

[[1]]$C
 [1] -0.8535937 -0.1753520  1.1008905 -0.0385363 -1.6739434  0.2179597 -0.1300490  0.4177869
 [9]  1.3066992  0.2369493

[[1]]$D
 [1]  0.98472409  0.66930725  0.52449977  0.08553770 -1.81759549 -0.07564249 -0.63611958
 [8] -1.19293507 -1.61571223  1.29777033

[[1]]$max
 [1]  1.3251288  0.6693073  1.1008905  0.0855377  0.7999346  0.4275318 -0.1300490  2.6436210
 [9]  1.3066992  1.2977703


[[2]]
...

假設 OP 中顯示的data.frame s df1df2位於名為dfllist中:

library(dplyr)
library(magrittr)

dfl <- lapply(dfl, function(x){
  x %<>% mutate(max = do.call(pmax, c(select(., c(2:4)))))
})

如果您想將list元素的名稱設置為data.frame中的某個值,也許是這樣的?

names(dfl) <- lapply(dfl, function(x){
  x[2,2]
})

我希望這就是您的實際意思,因為您的問題對我來說有點不清楚。 (如果我錯了,請道歉。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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