【问题标题】:How to multiply and divide all values in a vector using a list in R and how to filter a list如何使用 R 中的列表乘以和除向量中的所有值以及如何过滤列表
【发布时间】:2021-10-01 13:36:00
【问题描述】:

我有一个列表(包含 83 个数据框),并且想在整个列表中将其中一个变量(即 Mn,参见下面的“实践”df)乘以 10000。然后我想找到 Mn 的最大值(在每个数据帧内),然后保留这个值(最大值)和低于它的所有值(在每个数据帧内)。除了这些 Mn 值,我还想保留数据框中所有其他变量的相应值(即 Ba、Sr)。对于所有变量,我想从每个数据框中排除高于此点的所有值。一旦我完成了这个缩减,我想将 Mn 返回到它的初始值(即将 Mn 除以 10000)。

以下是练习脚本和我想要达到的目标(Mn 事先乘以 10000,然后再除以 10000)。任何帮助将不胜感激。

Ba <- c(1,1,1,2,2)
Sr <- c(1,1,1,2,2)
Mn <- c(1,1,2,1,1)
df <- data.frame(Ba, Sr, Mn)

df

#   Ba Sr Mn
# 1  1  1  1
# 2  1  1  1
# 3  1  1  2
# 4  2  2  1
# 5  2  2  1

这就是我想在 R 中实现的目标:

Ba <- c(1,2,2)
Sr <- c(1,2,2)
Mn <- c(2,1,1)
df <- data.frame(Ba, Sr, Mn)

df

#     Ba  Sr  Mn
# 1   1   1   2
# 2   2   2   1
# 3   2   2   1

我认为我的问题的过滤器部分的脚本是这样的:

MaxMn <- lapply(df, function(df){
  df %>% 
   filter(cummax(invoke(pmax, cur_data())) == max(cur_data()))
})

【问题讨论】:

    标签: r list filter multiplication divide


    【解决方案1】:

    要从Mn 列中的最大值中选择所有行,您可以使用filter as -

    library(dplyr)
    
    df %>% filter(row_number() >= which.max(Mn))
    
    #  Ba Sr Mn
    #1  1  1  2
    #2  2  2  1
    #3  2  2  1
    

    slice -

    df %>% slice(which.max(Mn):n())
    

    在基础 R 中 -

    df[which.max(Mn):nrow(df), ]
    

    您可以使用 lapply/map 将其应用于数据框列表 -

    lapply(list_df, function(df) df %>% filter(row_number() >= which.max(Mn)))
    

    【讨论】:

    • 感谢您的建议。您知道我是如何在使用您提供的脚本之前先将 Mn 乘以 10000,然后如何将使用您提供的脚本后创建的缩减数据除以 10000 吗?
    • 您可以使用df %&gt;% mutate(Mn = Mn * 10000) %&gt;% filter(row_number() &gt;= which.max(Mn)) %&gt;% mutate(Mn = Mn/10000),但您为什么要这样做?乘以 10000 再除以相同的数字。
    • 我可能不需要... Sr 值远大于数据中的 Mn 值,并且使用我使用的原始脚本(使用 cummax),我无法获得Mn 的最大值,因为它在 10000 的数量级上比 Sr 低得多。我现在将运行你的脚本,让你知道我是怎么走的。感谢您的帮助...我是 R 菜鸟!
    • 我的 df 被命名为 Graphdat,在脚本的第一部分你有: lapply(list_df, function(df)。这是否意味着我输入它作为 lapply(list_Graphdat, function(Graphdat) 或只是简单地说: lapply(Graphdat, function(Graphdat) ?
    • 另外,我数据中的 Mn 实际上是 Mn55:Ca。我已将您的脚本输入为: MaxMn % filter(row_number() >= which.max(Mn55:Ca)) }) 但我收到此错误错误:问题使用filter() 输入..1。 x 对象 'Mn55' 未找到 i 输入 ..1row_number() &gt;= which.max(Mn55:Ca)。知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2021-11-27
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多