【问题标题】:Applying a function to all pairwise combination of rows in a subset of a data frame将函数应用于数据帧子集中的所有成对行组合
【发布时间】:2020-06-07 10:16:24
【问题描述】:

假设我有下面的数据框。如何将一些任意函数应用于数据框子集中的所有成对行组合?例如,我如何仅计算标记为“red..”的列的标记为(alpha、beta、gamma)的每个组合的平均值?因为这只是一个例子,我希望找到平均值的只有 3 对数字组合:(1, 0, 6) & (7, 2, 10) 的平均值,(1, 0, 6) & (6, 3, 11) 和 (7, 2, 10) & (6, 3, 11)。但我正在寻找可以应用于特定子集中更多行/列的代码,这可能是 100 对成对组合(没有重复/重复组合)。谢谢!

df <- read.csv("test.csv", row.names = 1, header = TRUE)
df
      red.1 red.2 red.3 yellow.1 yellow.2
alpha     1     0     6       56       59
beta      7     2    10       59       64
gamma     6     3    11      100      105
pi     1009  2104   290        6        5

【问题讨论】:

    标签: r function dataframe apply


    【解决方案1】:

    您可以编写一个函数,根据行名选择行,根据名称中的模式选择列,将它们逐行拆分,创建它们的所有可能组合,一次取 2 个并计算每个组合的 mean

    get_average <- function(data, row, col_pattern) {
      combn(asplit(data[row, grep(col_pattern, names(data))], 1), 2, 
                   function(x) mean(unlist(x)))
    }
    

    然后我们可以将行名和列名模式传递给这个函数。

    get_average(df, c('alpha', 'beta', 'gamma'), 'red')
    #[1] 4.3 4.5 6.5
    

    要获得每个组合之间的相关性,我们可以这样做:

    PCC <- function(data, row, col_pattern) {
       combn(asplit(data[row, grep(col_pattern, names(data))], 1), 2,
              function(x) cor(x[[1]], x[[2]]))
    }
    
    PCC(df, c('alpha', 'beta', 'gamma'), 'red')
    #[1] 0.87 0.98 0.96
    

    数据

    df <- structure(list(red.1 = c(1L, 7L, 6L, 1009L), red.2 = c(0L, 2L, 
    3L, 2104L), red.3 = c(6L, 10L, 11L, 290L), yellow.1 = c(56L, 
    59L, 100L, 6L), yellow.2 = c(59L, 64L, 105L, 5L)), class = 
    "data.frame", row.names = c("alpha", "beta", "gamma", "pi"))
    

    【讨论】:

    • 我正在尝试将函数更改为“cor”而不是“mean”。但是我收到一个错误,@Ronak Shah 有什么想法吗? cor
    • @Abigail575 请给函数起一个不同的名字,cor 已经是一个函数了。
    • 感谢您的回复。这个可以吗? PCC
    • 谢谢!但是当我运行它时(在运行“数据”之后)我得到: grep 中的错误(col_pattern,名称(数据)):缺少参数“col_pattern”,没有默认值
    • 你确定你正确地传递了参数而没有任何错字吗?您的错误消息说您没有传递 col_pattern 参数。它对我有用,如我共享的数据的答案所示。
    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2016-04-26
    • 2020-02-17
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 2012-10-16
    相关资源
    最近更新 更多