假设我有大量的列表,每个列表包含3行(我在这里显示3行),我想获得列表的名称(List1,List2等),每个列表的最小值和给定3行中的第三行。在这种情况下,List3是答案(0.1948026和0.1125526具有所有列表的最小值),如何仅将List3作为我的输出?
list1<-list(
0.3318594
,0.1296125
, 0.1262203)
list2<- list(
0.3654229
,0.1428565
,0.1552035)
list3<- list(
0.1948026
,0.1272514
,0.1125526)
答案 0 :(得分:4)
data.table
可能是最快的解决方案。
你可以这样做:
library(data.table)
#add all in a list
the_lists <- list(list1, list2, list3)
或者根据@DavidArenburg的评论,它可能会好得多(如果你的列表都在全球环境中),请执行以下操作:
#this will create a list with all lists in your global env
#that are named list1, list2, list3 etc.
the_lists <- mget(ls(pattern = "list.+"))
#create a data table ouf of them
#notice that every row represents a list here
all_lists <- rbindlist(the_lists)
#find the list with the minimum row
#which for this case means find the min location of each column
mins <- as.numeric(all_lists[, lapply(.SD, which.min)])
#> mins
#[1] 3 3 3
然后只需使用分钟来检索所需的列表。
对于第1行使用:
> the_lists[mins[1]]
$list3
$list3[[1]]
[1] 0.1948026
$list3[[2]]
[1] 0.1272514
$list3[[3]]
[1] 0.1125526
和第3行:
> the_lists[mins[3]]
$list3
$list3[[1]]
[1] 0.1948026
$list3[[2]]
[1] 0.1272514
$list3[[3]]
[1] 0.1125526
根据@DavidArenburg的建议使用mget
创建列表名称,并将如上所示。
获取值和名称:
> data.frame(min_loc = mins[c(1,3)], names = names(the_lists)[c(mins[c(1,3)])])
min_loc names
1 3 list3
2 3 list3
答案 1 :(得分:1)
试试这个:
# Collect lists
collection.list <- list("list1"=list1,"list2"=list2,"list3"=list3)
#Build data
matrix <- do.call(rbind,collection.list)
# Select columns
used.columns <- c(1,3)
# Find minimum value
min.ind <- which(matrix[,used.columns]==min(unlist(matrix[,used.columns])),arr.ind = TRUE)
# Find name
names(collection.list)[min.ind[,"row"]]
答案 2 :(得分:1)
我认为这应该有用,
common_list <- mapply(c, list1, list2, list3, SIMPLIFY=FALSE)
a <- lapply(mapply(c, list1, list2, list3, SIMPLIFY=FALSE), min)
b <- paste("list", unlist(lapply(mapply(c, list1, list2, list3, SIMPLIFY=FALSE), which.min)))
data.frame(Min_value = unlist(a), List = unlist(b))
# Min_value List
# 1 0.1948026 list 3
# 2 0.1272514 list 3
# 3 0.1125526 list 3
然而,这给每行提供了最小值。
答案 3 :(得分:1)
您的列表是在您的全球环境中定义的,而不是在列表中...这是一个坏习惯。尽管如此,您可以通过这种方式解决问题:
# first catch your lists names in your envrionment
lnames = Filter(function(x) class(get(x))=='list', ls(pattern="list\\d+", env=globalenv()))
# gather values in the matrix - the colummn names will be the list names
m = sapply(lnames, get)
# to get the name of the list(s) with min value in 1st and 3rd position
colnames(m)[unique(apply(m[c(1,3),],1,which.min))]
#[1] "list3"