【问题标题】:Find minimum/maximum within same column of dataframes in a list R在列表 R 中的同一列数据帧中查找最小值/最大值
【发布时间】:2015-11-28 09:36:36
【问题描述】:

我在名为mrnslist 中有323 个data.frames。在每个data.frame 中,都有一个名为raw.Systolic 的变量。我需要做的是在所有 323 个data.frames 中找到最小/最大raw.Systolic。我可以为每个data.frame 输出最小值,但这不是我需要的。

到目前为止,我得到的最接近的是输出每个文件的最小值列表并试图找到一种方法来找到该输出的最小值,但我不知道如何。

这是我目前所拥有的:

for (i in 1:323) {
  print(min(mrns[[i]]$raw.Systolic, na.rm=TRUE))
}

哪些输出:

[1] 86
[1] 109
[1] 114
[1] 104
[1] 115
...etc until 323 maximums are listed

当我这样做时:

for (i in 1:323) {
  mins <- min(mrns[[i]]$raw.Systolic, na.rm=TRUE)
}

我明白了:

> mins
[1] 129

有人有什么建议吗?

【问题讨论】:

  • min(sapply(mrns,function(x)min(x$raw.Systolic))),或者对于最大值和最小值,range(c(sapply(mrns,function(x)range(x$raw.Systolic))))
  • @MichaelChirico 为什么要用内层min
  • @Roland 我想这没必要吧。没有样本数据,因此无法进行任何基准测试。
  • @Roland 三思而后行,如果data.frames 在nrow 中不同,sapply 将返回一个列表,并且外部最小值将不再起作用。
  • @MichaelChirico 最小值的最小值与所有值的最小值相同。所以,是的,你绝对可以在循环内保存对min 的调用。

标签: r dataframe min


【解决方案1】:

试试,

min(unlist(lapply(mrns, function(x) min(x$raw.Systolic, na.rm=T))))

【讨论】:

    【解决方案2】:

    我们可以这样做:

    #minima:
    do.call("min",sapply(mrns,getElement,name="raw.Systolic"))
    
    #ranges
    do.call("range",sapply(mrns,getElement,name="raw.Systolic"))
    
    #NA-proof
    do.call("min",c(sapply(mrns,getElement,name="raw.Systolic"),na.rm=T))
    

    注意getElement只是函数形式的提取运算符$,即x$ygetElement(object=x,name="y")相同。

    如果您知道mrns 的所有元素具有相同的行数,只需使用min(sapply(...)) 代替。

    由于sapply 可能返回list,因为mrns 的每个元素可能有不同的行数,我们使用do.call 允许我们将list 传递给min 和@ 987654334@.

    【讨论】:

    • 感谢您的回复。当我运行它时,我得到[1] NA NA。将不同的回复标记为答案,但感谢您的回复!感谢您的帮助。
    • @nchimato 查看编辑以了解如何将na.rm=T 参数添加到上述内容。请注意,另一个答案可能效率低下,因为它在内循环中调用 min 323 次,并在完成后再次调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2021-07-25
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多