Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何编写对数据帧中的所有组/变量组合进行配对t检验的函数_R_Function_Loops_Comparison - Fatal编程技术网

R 如何编写对数据帧中的所有组/变量组合进行配对t检验的函数

R 如何编写对数据帧中的所有组/变量组合进行配对t检验的函数,r,function,loops,comparison,R,Function,Loops,Comparison,我有一个类似于下面创建的data的数据框: ID我想这就是你想要的。关键是使用group_by和tidyverse的do df <- NULL for(i in (4:(ncol(data)-1))){ for(j in ((i+1):ncol(data))){ df <- rbind(df,data %>% group_by(Location) %>% do(data.frame(p

我有一个类似于下面创建的
data
的数据框:


ID我想这就是你想要的。关键是使用group_by和tidyverse的do

df <- NULL
for(i in (4:(ncol(data)-1))){
  for(j in ((i+1):ncol(data))){
    df <- rbind(df,data %>% 
                  group_by(Location) %>% 
                  do(data.frame(pval = t.test(.[[i]],.[[j]], data = .)$p.value)) %>% 
                  ungroup() %>% 
                  mutate(Test = paste0(colnames(data)[i],'.vs.',colnames(data)[j]))
                )
  }
}
df$Test <- paste0(df$Test,'.In',df$Location)
df%
do(data.frame(pval=t.test([i]],[j]],data=)$p.value))%>%
解组()%>%
突变(Test=paste0(colnames(data)[i],'.vs.,colnames(data)[j]))
)
}
}

df$Test也许,您可以使用以下代码实现您想要的:

library(dplyr)
library(tidyr)

data %>%
  pivot_longer(cols = FirstPt:Last10) %>%
  group_by(Variable) %>%
  summarise(p_value = list(combn(name, 2, function(x) 
                       t.test(value[name == x[1]], value[name == x[2]])$p.value)), 
            test = list(combn(name, 2, paste, collapse = "_"))) %>%
  unnest(cols = c(test, p_value))


#  Variable p_value test           
#   <fct>      <dbl> <chr>          
# 1 CaCO       0.915 FirstPt_LastPt 
# 2 CaCO       0.529 FirstPt_First3 
# 3 CaCO       0.337 FirstPt_First5 
# 4 CaCO       0.350 FirstPt_First7 
# 5 CaCO       0.395 FirstPt_First10
# 6 CaCO       0.765 FirstPt_Last3  
# 7 CaCO       0.204 FirstPt_Last5  
# 8 CaCO       0.873 FirstPt_Last7  
# 9 CaCO       0.479 FirstPt_Last10 
#10 CaCO       1     FirstPt_FirstPt
# … with 24,740 more rows
库(dplyr)
图书馆(tidyr)
数据%>%
枢轴长度(cols=FirstPt:Last10)%>%
分组依据(变量)%>%
总结(p_值=列表(组合)(名称,2,功能(x)
t、 测试(值[name==x[1]],值[name==x[2]])$p.value)),
测试=列表(组合(名称,2,粘贴,折叠=“”))%>%
unnest(cols=c(测试,p_值))
#可变p_值检验
#                    
#1 CaCO 0.915第一次/最后一次
#2 CaCO 0.529 FirstPt_First3
#3 CaCO 0.337 FirstPt_First5
#4 CaCO 0.350 FirstPt_First7
#5 CaCO 0.395 FirstPt_First10
#6 CaCO 0.765首件最后3件
#7 CaCO 0.204首件最后5件
#8 CaCO 0.873第一部分最后7
#9 CaCO 0.479首件10
#10 CaCO 1 FirstPt_FirstPt
#…还有24740行

要按
Location
分组,您可以将其添加到
groupby
命令中,并保持代码的其余部分不变

您可以使用一个功能同时执行这两项操作:

library(tidyverse)

t.test.by.group.combos <- function(.data, groups){
  by <-  gsub(x = rlang::quo_get_expr(enquo(groups)), pattern = "\\((.*)?\\)", replacement = "\\1")[-1]
  .data %>%
    group_by(!!!groups) %>%
    select_if(is.integer) %>%
    group_split() %>%
    map(.,
      ~pivot_longer(., cols = (FirstPt:Last10), names_to = "name", values_to = "val") %>%
        nest(data = val) %>%
        full_join(.,.,by = by) %>%
        filter(name.x != name.y) %>%
        mutate(test = paste(name.x, "vs",name.y, !!!groups, sep = "."),
               p.value = map2_dbl(data.x,data.y, ~t.test(unlist(.x), unlist(.y))$p.value)) %>%
        select(test,p.value)%>%
      filter(!duplicated(p.value))
    ) %>%
    bind_rows() 
}


t.test.by.group.combos(data, vars(Variable))
#> # A tibble: 225 x 2
#>    test                    p.value
#>    <chr>                     <dbl>
#>  1 FirstPt.vs.LastPt.CaCO    0.511
#>  2 FirstPt.vs.First3.CaCO    0.184
#>  3 FirstPt.vs.First5.CaCO    0.494
#>  4 FirstPt.vs.First7.CaCO    0.354
#>  5 FirstPt.vs.First10.CaCO   0.893
#>  6 FirstPt.vs.Last3.CaCO     0.496
#>  7 FirstPt.vs.Last5.CaCO     0.909
#>  8 FirstPt.vs.Last7.CaCO     0.439
#>  9 FirstPt.vs.Last10.CaCO    0.146
#> 10 LastPt.vs.First3.CaCO     0.578
#> # … with 215 more rows

t.test.by.group.combos(data, vars(Variable, Location))
#> # A tibble: 674 x 2
#>    test                          p.value
#>    <chr>                           <dbl>
#>  1 FirstPt.vs.LastPt.CaCO.Alpha    0.850
#>  2 FirstPt.vs.First3.CaCO.Alpha    0.822
#>  3 FirstPt.vs.First5.CaCO.Alpha    0.895
#>  4 FirstPt.vs.First7.CaCO.Alpha    0.810
#>  5 FirstPt.vs.First10.CaCO.Alpha   0.645
#>  6 FirstPt.vs.Last3.CaCO.Alpha     0.870
#>  7 FirstPt.vs.Last5.CaCO.Alpha     0.465
#>  8 FirstPt.vs.Last7.CaCO.Alpha     0.115
#>  9 FirstPt.vs.Last10.CaCO.Alpha    0.474
#> 10 LastPt.vs.First3.CaCO.Alpha     0.991
#> # … with 664 more rows
库(tidyverse)
t、 test.by.group.combos%
如果(是整数)%>%,请选择_%
组分割()%>%
地图(.)。,
~pivot_更长(,cols=(FirstPt:Last10),name_to=“name”,values_to=“val”)%>%
嵌套(数据=val)%>%
全联接(,,by=by)%>%
过滤器(name.x!=name.y)%>%
突变(测试=粘贴(name.x,“vs”,name.y,!!!组,sep=“.”),
p、 value=map2_dbl(data.x,data.y,~t.test(unlist(.x),unlist(.y))$p.value))%>%
选择(测试,p.value)%>%
过滤器(!重复(p.value))
) %>%
绑定_行()
}
t、 test.by.group.combos(数据、变量)
#>#A tible:225 x 2
#>测试p值
#>                         
#>1 FirstPt.vs.LastPt.CaCO 0.511
#>2 FirstPt.vs.First3.CaCO 0.184
#>3 FirstPt.vs.First5.CaCO 0.494
#>4 FirstPt.vs.First7.CaCO 0.354
#>5 FirstPt.vs.First10.CaCO 0.893
#>FirstPt.6 vs.Last3.CaCO 0.496
#>7 FirstPt.vs.Last5.CaCO 0.909
#>8 FirstPt.vs.Last7.CaCO 0.439
#>9 FirstPt.vs.Last10.CaCO 0.146
#>10 LastPt.vs.First3.CaCO 0.578
#>#…还有215行
t、 test.by.group.combos(数据、变量(变量、位置))
#>#A tibble:674 x 2
#>测试p值
#>                               
#>1 FirstPt.vs.LastPt.CaCO.Alpha 0.850
#>2 FirstPt.vs.First3.CaCO.Alpha 0.822
#>3 FirstPt.vs.First5.CaCO.Alpha 0.895
#>4 FirstPt.vs.First7.CaCO.Alpha 0.810
#>5 FirstPt.vs.First10.CaCO.Alpha 0.645
#>6 FirstPt.vs.Last3.CaCO.Alpha 0.870
#>7 FirstPt.vs.Last5.CaCO.Alpha 0.465
#>8 FirstPt.vs.Last7.CaCO.Alpha 0.115
#>9第一对最后10.CaCO.Alpha 0.474
#>10 LastPt.vs.First3.CaCO.Alpha 0.991
#>#…还有664行

这是一个很长的函数,但通常我们通过
groups
参数分组,然后选择组和任何整数列,然后按组分割数据帧。之后,我们映射所有变量组合,并对每个组合执行t.test。最后,我们将所有组重新加入到一个数据帧中

查看
combn
以获得包含所有可能组合的列表,然后使用
lappy
对该列表的元素进行迭代操作(例如,配对t检验)。此函数的某些部分完全超出了我的知识库。但我正在努力想办法。它完全符合我所提供的示例数据的要求。但是,当我试图在另一个数据集上实现它时,我无法让它工作。我得到这个错误代码:
x:y:NA/NaN参数中的错误
。数据集之间唯一的区别是前3列的名称,在这种情况下,函数中是否有我需要更改的内容?@Ryan
class(data$FirstPt)
返回什么?另外,您发现函数的哪些部分令人困惑?我很乐意解释。它返回“数值”。数据帧的名称是
PtData
而不是
data
位置
更改为
区域
ID
更改为
IdNum
变量
更改为
元素
。从左到右为
IdNum
元素
河流
。每个级别都有不同的名称(铜是铜,等等),但我认为这不重要。那太好了!我不熟悉
gsub()
,一般来说,我只需要通读帮助文件。以下是我还不明白的事情:我不知道
到底是什么在代码中引用或执行(
.data
完全连接(,)
!!!组
,等等…)。另外,在:
map(,~pivot\u longer(,)
中使用点和波浪线,以及
by=by
full\u join()中的作用