R语言 我们可以按组计算所有列的趋势吗?

mpbci0fu  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(181)

我有一个如下所示的数据框。我想计算所有数值列的趋势,以及它们是否显著或不每个名称。

library(EnvStats)
  dat=structure(list(date = c("1983-12-01", "1984-01-01", 
  "1984-02-01", 
                    "1984-03-01", "1984-04-01", "1984-05-01"), 
  rig = c(68.1, 62.4, 
                                                                       
   67.5, 78.9, 81.7, 72.2), pass = c(9.57, 10.49, 11.97, 
  11.43, 9.54, 
                                                                                                         
  8.98), name = structure(c(1L, 2L, 3L, 4L, 5L, 6L), levels = 
  c("az",  "az", "nc", "nc", "et", "et"), class = "factor")), 
  row.names = c(NA, 6L), class = "data.frame")

在R中有没有一个函数可以做到这一点?我们可以用途:

kendallTrendTest(rig ~ date)

但是我应该怎样做才能让所有列都有这样的输出呢?

name    rig_trend_slope   rig_trend_pvalue pass_trend_slope   pass_trend_pvalue
  az
  nc
  et
ikfrs5lh

ikfrs5lh1#

正如@Quiten提到的,数据中的观察数量是有限的,所以分组方法会返回错误。如果我们想对多列执行此操作,请对summarise中的列执行across循环,从list输出中提取所需的组件作为tibble,然后使用unnest_wider创建宽数据集

library(dplyr)
library(tidyr)
library(EnvStats)
library(tibble)
library(flextable)
library(officer)
dat1 <- dat %>%
  mutate(date2 = as.numeric(as.Date(date))) %>%
  # group_by(name) %>%
  # or use reframe in the devel version
  summarise(across(rig:pass, ~ 
                     {tmp <- kendallTrendTest(reformulate('date2', 
     response = cur_column()))
                     tibble(trend_slope = tmp$estimate['slope'],
                            trend_pvalue = tmp$p.value)})) %>%
  unnest_wider(where(is_tibble), names_sep = "_") %>%
  flextable %>%
  colformat_double(i=1,digit=2 )
for(nm in dat1$col_keys)
  {dat1 <- dat1 %>%
  color(i= as.formula(sprintf("~%s<0", nm)), j=nm, color="red")
  }
  • 输出

要保存为word格式,我们可以使用officer包中的save_as_docx

tf <- tempfile(fileext = ".docx")
save_as_docx(
  dat1, path = tf
)
  • 输出

注:此处group_by(name)被注解,因为只有2个观察值,并且在所有情况下都返回错误。对于完整数据集,取消注解group_by(名称)
broom::tidy似乎与kendallTrendTest中的类存在问题

y1aodyip

y1aodyip2#

首先,每组只有两个值,这是不理想的。要计算每组的趋势,可以使用dplyrgroup_bydo执行测试。还要确保kendallTrendTest中的x变量是数值。可以使用tidy获得一些系数。下面是一个可重现的示例:

library(dplyr)
library(EnvStats)
library(broom)

models <- dat %>% 
  mutate(date2 = as.numeric(as.Date(date))) %>%
  group_by(name) %>% 
  do(model = kendallTrendTest(rig ~ date2, data = .))

models %>% 
  broom::tidy(model)

相关问题