在许多其他列表上使用条件后,如何仅将特定列表作为输出

时间:2015-10-21 13:35:33

标签: r list loops

假设我有大量的列表,每个列表包含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)

4 个答案:

答案 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"