【问题标题】:R dplyr rowMeans with filterR dplyr rowMeans 带过滤器
【发布时间】:2018-01-17 01:06:59
【问题描述】:

我看过几篇关于在变异中获取 rowMeans 类型的结果的帖子。例如和dplyr - using mutate() like rowmeans() -- 但我想让另一个变量充当过滤器。

我知道这个数据不整齐,“f#”和“d#”变量可以reshape long,然后转换为“f”和“d”,然后过滤“f”并总结“d” .但是有没有办法在不重塑的情况下做到这一点?我设计了下面的代码

library(tidyverse)

x<-data.frame(f1=c(1,1), f2=c(1,0), f3=c(1,1),
              d1=c(3,2), d2=c(4,8), d3=c(8,16))
x

x %>%
  rowwise() %>%
  mutate(agg=sum(f1*d1, f2*d2, f3*d3) / sum(f1, f2, f3) )

#Source: local data frame [2 x 7]
#Groups: <by row>

# A tibble: 2 x 7
#     f1    f2    f3    d1    d2    d3   agg
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  1.00  1.00  1.00  3.00  4.00  8.00  5.00
#2  1.00  0     1.00  2.00  8.00 16.0   9.00

但是,当有很多变量时,我失去了使用范围的能力,所以我不能说 "f1*d1":"f2*d2" - 有没有更通用的方法?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    假设f 列和d 列具有相同的后缀并且长度相等,即f 列和d 列的数量相同,您可以使用选择辅助函数:

    x %>% 
        select(sort(names(x))) %>%   # sort the names so the f columns and d columns correspond
        mutate(agg = {
            fs = select(., starts_with('f')) 
            ds = select(., starts_with('d'))
            rowSums(fs * ds) / rowSums(fs) 
        })
    
    #  d1 d2 d3 f1 f2 f3 agg
    #1  3  4  8  1  1  1   5
    #2  2  8 16  1  0  1   9
    

    【讨论】:

    • 感谢 Psidom。它有效,但我不完全理解。 fs 和 ds 是列的选择。不知何故,这些 mini-dataFrame 可以存在于 {} 中,但我无法将 fs 和 ds 作为管道中的步骤 - 只是添加以 fs 为前缀的列。或ds。 - {} 是否在 . fs 和 ds 数据帧可以共存吗?
    • {} 只是代表一段代码,它将按顺序执行,并有一个返回值分配给aggfsds 都是从原始数据帧中选择的,原始数据帧以. 形式输入。管道不起作用,因为当您执行select(., starts_with('f')) 之类的操作时,它会丢失所有d 列,因此您不能再选择d 列。因此选择必须并行进行,即两者都可以访问原始数据框。希望这对您有所帮助。
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2019-04-04
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多