如何选择因子组的子集来完成R中的统计检验

时间:2016-02-24 08:27:42

标签: r

我有一个包含几个变量的数据集,我希望单独统计测试每个变量的方差(Kruskal-test)。

我的数据(df)看起来像:(不同农业管理层的碳和氮含量(见名称))。 我有16个小组(为了简化它,我说,我有8个小组):

数据摘录

1. List item
name    N_cont  C_cont  agriculture
C_ero   1,064   8,380   1
C_ero   0,961   8,086   1
C_ero   0,977   8,331   1
Ds_ero  1,767   17,443  2
Ds_ero  1,802   18,264  2
Ds_ero  2,083   20,112  2
Ms_ero  1,547   14,380  3
Ms_ero  1,566   15,313  3
Ms_ero  1,505   14,760  3
Md_ero  1,512   14,303  4
Md_ero  1,656   15,331  4
Md_ero  1,500   13,788  4
C_upsl  1,121   10,581  5
C_upsl  1,159   10,460  5
C_upsl  1,223   10,171  5
Ds_upsl 1,962   20,656  6
Ds_upsl 1,784   16,780  6
Ds_upsl 1,720   17,482  6
Ms_upsl 1,578   16,228  7
Ms_upsl 1,634   15,331  7
Ms_upsl 1,394   13,419  7
Md_upsl 1,286   11,824  8
Md_upsl 1,241   11,452  8
Md_upsl 1,317   11,932  8

我已经为农业提出了一个因素

df$agriculture<-factor(df$agriculture)

我可以对所有16组进行统计测试。 例如kruskal.test(df$C,df$agriculture)

但是现在我想对8组中的特定组进行统计测试,例如包含例如C列中的DS(常规)或更确切name(直接播种) 或者例如ero(侵蚀网站)或upsl(上坡)

它确实尝试grepsplit,但它不起作用,因为x和y的维度应该相同。

你有任何线索吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用grepl进行子集化。假设您需要名称中包含DSupslC的行,那么

df[grepl("(DS)|(upsl)|(C)", df$name), ]

#     name  N_cont C_cont   agriculture
#1    C_ero  1,064  8,380           1
#2    C_ero  0,961  8,086           1
#3    C_ero  0,977  8,331           1
#13  C_upsl  1,121 10,581           5
#14  C_upsl  1,159 10,460           5
#15  C_upsl  1,223 10,171           5
#16 Ds_upsl  1,962 20,656           6
#17 Ds_upsl  1,784 16,780           6
#18 Ds_upsl  1,720 17,482           6
#19 Ms_upsl  1,578 16,228           7
#20 Ms_upsl  1,634 15,331           7
#21 Ms_upsl  1,394 13,419           7
#22 Md_upsl  1,286 11,824           8
#23 Md_upsl  1,241 11,452           8
#24 Md_upsl  1,317 11,932           8

如果您不想对name值进行硬编码,也可以尝试

x <- c("C", "DS", "upsl")
df[grepl(paste0(x, collapse = "|"), df$name), ]

也会产生相同的结果。

答案 1 :(得分:0)

加载data.table包。

library(data.table)

创建您要执行统计信息的组的子集: 如果你的数据帧是df,那么

DT<-data.table(df)
DT[like(name,"C_")]

..或使用sqldf包:

library(sqldf)
sqldf("select * from df where name like 'C_'")