Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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 如何创建一个循环或函数,在包含变量的两个向量列表中循环,以便对响应运行KS测试_R_Function_Loops_Tidyr_Kolmogorov Smirnov - Fatal编程技术网

R 如何创建一个循环或函数,在包含变量的两个向量列表中循环,以便对响应运行KS测试

R 如何创建一个循环或函数,在包含变量的两个向量列表中循环,以便对响应运行KS测试,r,function,loops,tidyr,kolmogorov-smirnov,R,Function,Loops,Tidyr,Kolmogorov Smirnov,为了方便起见,我简化并概括了该问题的代码 因此,我的问题(即R)是,我正试图通过一组Kolmogorov-Smirnov ks.boot测试,对两个因素进行多个级别的测试。我需要为每个级别的向量df子集数据。测试$名称(例如代表物种名称的W、X、Y和Z),然后通过比较每个级别的df之间的长度分布循环。测试$TSM.FACT(例如代表时间段的A、B、C等) 因此,对于df.test$名称中的每个级别(例如W、X、Y、Z),我需要比较不同时间段A和B的长度分布;然后A对C,然后B对C,并将每个结果保

为了方便起见,我简化并概括了该问题的代码

因此,我的问题(即R)是,我正试图通过一组Kolmogorov-Smirnov ks.boot测试,对两个因素进行多个级别的测试。我需要为每个级别的向量df子集数据。测试$名称(例如代表物种名称的W、X、Y和Z),然后通过比较每个级别的df之间的长度分布循环。测试$TSM.FACT(例如代表时间段的A、B、C等)

因此,对于df.test$名称中的每个级别(例如W、X、Y、Z),我需要比较不同时间段A和B的长度分布;然后A对C,然后B对C,并将每个结果保存在数据帧中;记录比较发生的位置

#for ease create the data##
  df.fact <- data.frame("A"=abs(rnorm(1000, mean = 350, sd=160)),"B"= abs(rpois(n = 1000, lambda = 50)), "C"=abs(rnorm(1000, mean = 200, sd=80)), names=rep(factor(LETTERS[23:26]), 1000))
library(reshape2)
df.test<-melt(df.fact, id.vars = "names", value.name = "Length2")
names(df.test)[names(df.test) =="variable"] <- "TSM.FACT"
names(df.test)[names(df.test) =="value"] <- "length2"

dfX <-subset(df.test, names == c("X"))
A <-subset(dfX , TSM.FACT  == c("A"))
B <-subset(dfX , TSM.FACT  == c("B"))
C <-subset(dfX , TSM.FACT  == c("C"))
KS.XAB <- ks.boot(A$length2,B$length2, nboots=5000)
KS.XAC <- ks.boot(A$length2,C$length2, nboots=5000)
KS.XBC <- ks.boot(B$length2,C$length2, nboots=5000)
summary(KS.XAB)
summary(KS.XAC)
summary(KS.XBC)

dfY<-subset(df.test, names == c("Y"))
A <-subset(dfY , TSM.FACT  == c("A"))
B <-subset(dfY , TSM.FACT  == c("B"))
C <-subset(dfY , TSM.FACT  == c("C"))
KS.YAB <- ks.boot(A$length2,B$length2, nboots=5000)
KS.YAC <- ks.boot(A$length2,C$length2, nboots=5000)
KS.YBC <- ks.boot(B$length2,C$length2, nboots=5000)
summary(KS.YAB)
summary(KS.YAC)
summary(KS.YBC)
#AND REPEAT FOR Z#
#为了方便创建数据##

df.fact准备所有的名称模式,TSM.FACT1、TSM.FACT2,您可以通过类似循环的方法轻松地完成所有测试

以下是我的例子:

library(tibble); library(tidyr); library(dplyr); library(purrr)

# preparing all pattern
comb_d <- df.test %>% 
  as_tibble() %>%       # conv to tibble
  group_by(names) %>% 
  summarize(TSM.FACT = list(unique(as.character(TSM.FACT)))) %>%   # get unique TSM.FACT as vector
  mutate(comb_ = map(TSM.FACT,
                     ~ {
                       .x %>%           # calculate all combination by combn()
                         combn(2) %>%   # output is row:2 x col:n matrix
                         t() %>% 
                         as_tibble()   # conv to row:n x col:2 tibble
                     })) %>% 
  dplyr::select(names, comb_) %>% 
  # unnest(names(.)) %>%   # for tidyr v1.0.0
  unnest() %>%             # for tidyr under v1.0.0
  set_names("names_", "TSM.FACT1", "TSM.FACT2") # chage colnames


# making data and do ks.test line by line
comb_d <- comb_d %>%               # I typo the below line, sorry.
  mutate(ks_res = pmap(list(names_, TSM.FACT1, TSM.FACT2),    # making data sets using 3rows
                       function(names_, TSM.FACT1, TSM.FACT2){

                         temp <- df.test %>% 
                           filter(names == names_)  # LIKE subset(df.test, names == c("X"))

                         d1 <- temp %>% 
                                  filter(TSM.FACT == TSM.FACT1) %>%   # LIKE subset(dfX , TSM.FACT  == c("A"))
                           pull(Length2)  # pull the col as vector

                         d2 <- temp %>% 
                           filter(TSM.FACT == TSM.FACT2) %>% 
                           pull(Length2)

                         Matching::ks.boot(d1, d2, nboots = 5000)  # do ks.boot

                       }))

# you can access the result such like
comb_d$ks_res[[1]] %>% 
  summary()
# or
comb_d %>% 
  filter(names == "X", TSM.FACT1 == "A", TSM.FACT2 == "B") %>% 
  pluck("ks_res")
库(tibble);图书馆(tidyr);图书馆(dplyr);图书馆(purrr)
#准备所有模式
梳齿直径%
as_tible()%>%#转换为tible
分组人(姓名)%>%
汇总(TSM.FACT=list(惟一(as.character(TSM.FACT)))%>%#获取惟一的TSM.FACT作为向量
变异(comb=映射(TSM.FACT,
~ {
.x%>%#通过combn()计算所有组合
combn(2)%>%#输出为行:2 x列:n矩阵
t()%>%
as_tible()#转换到行:n x列:2 tible
})) %>% 
dplyr::选择(名称、梳)%>%
#tidyr v1.0.0的最新(名称(%)%>%#
v1.0.0下三年的unnest()%>%#
设置名称(“名称”、“TSM.FACT1”、“TSM.FACT2”)\chage colnames
#制作数据并逐行进行ks测试
对不起,我在下面一行打错了。
变异(ks_res=pmap(列表(名称,TSM.FACT1,TSM.FACT2)),使用3行创建数据集
功能(名称、TSM.FACT1、TSM.FACT2){
温度%
过滤器(names==names_35;类似子集(df.test,names==c(“X”))
d1%
过滤器(TSM.FACT==TSM.FACT1)%>%#类子集(dfX,TSM.FACT==c(“A”))
拉动(长度2)#拉动列作为向量
d2%
过滤器(TSM.FACT==TSM.FACT2)%>%
拉力(长度2)
匹配::ks.boot(d1,d2,nboots=5000)#执行ks.boot
}))
#您可以像这样访问结果
comb_d$ks_res[[1]]%>%
摘要()
#或
梳d%>%
过滤器(名称==“X”,TSM.FACT1==“A”,TSM.FACT2==“B”)%>%
拔毛

谢谢乌贼44,尽管我不能制作梳子。我相信它在{unnest(names(.))%>%}的参数上失败了。错误消息“error:Column
names(.)
的长度必须为4(行数)或1,而不是2”@George;对不起,我迟了答复。也许你的
tidyr
不是最新的,是吗?但我不建议马上就开始学习,因为这是一个专业,学习需要时间。对于旧的
tidyr
,请使用unnest()而不是
unnest(名称()
。你好,墨鱼,没问题。不幸的是,我仍然收到一条错误消息:我正在使用Rstudio版本1.1.463和r版本3.5,tidyr 0.8.3。错误消息
select(,names,comb_uu)中出错:未使用的参数(names,comb_u)
I编辑了我的输入错误(与您的错误无关)。可能是包冲突导致了错误(
MASS
vs
dplyr
)。请使用
dplyr::select
而不是
select
(我在这里编辑了我的答案);谢谢你。虽然你可以编辑你的答案来显示你需要图书馆(tidyr)?还是含蓄?再次感谢。