【问题标题】:Analysis by row with multiple functions in dplyrdplyr中具有多个功能的行分析
【发布时间】:2019-02-17 13:52:25
【问题描述】:

我正在尝试使用 dplyr 解析 data.frame 的案例(行),但无济于事。我为此创建了两个函数:

f1 <- function(x) {
  c(s = sum(x), 
    m = mean(x), 
    v = var(x))
}

f2 <- function(x) {
  apply(x, 1, f1)
}

我的data.frame (data_1):

for (i in 1:6) {
  assign(paste('var', i, sep = '_'), 
runif(30, 20, 100))
}

data_1 <- do.call(
  cbind.data.frame, 
  mget(ls(pattern = '*v'))
)

使用dplyr 函数:

library(dplyr)

data_1 %>%
  mutate_at(.vars = vars (starts_with('v')),
            .funs = funs(.= f2))

data_1 %>%
  mutate_if(is.numeric, .funs = funs(.= f2))

mutate_impl(.data, dots) 中的错误:评估错误:dim(X) 必须具有正长度。

由于分析是按行进行的,并且我有三个函数(求和、均值和方差),因此预期收益是三列。

【问题讨论】:

  • apply(x, 1, f1) 如果x 的维度小于 2,则没有多大意义。 dplyr::mutate_* 逐列而不是逐行应用函数。
  • 如何解决?
  • 好的手机,所以我无法检查文档,但是 rowwise() 会解决这个问题吗?或者,您可以转置 data1
  • 解决方案如何使用 rowwise?

标签: r dplyr


【解决方案1】:

事实上,尽管没有被弃用,rowwise() 并不能很好地与其他分组和汇总函数配合使用,因此最好在 dplyr 中避免使用。一个有用的替代方法是按行号分组。这是使用这种方法解决上述问题的方法。

colNames <- syms(paste0("var_", 1:6))
data_1 %>%
   group_by (row_number()) %>%
   summarize(dataMean = mean(!!!colNames),
             dataSum = sum(!!!colNames))

【讨论】:

  • 很高兴知道!!看起来它可能不会被弃用,但肯定不推荐。有一个有趣的讨论here
  • 对 rowwise() 替代方案的讨论非常好。看起来它被淡化了,而不是被弃用了。谢谢@Andrew
猜你喜欢
  • 2012-10-20
  • 2019-05-16
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多