R语言data.table按行分组列执行ks.test并计算p.value的实现方法
R语言data.table按行执行KS检验实现方案
你需要的逐行分组KS检验可以通过data.table的逐行分组语法实现,完整实现代码如下:
# 加载data.table包 library(data.table) # 导入数据集并转换为data.table格式 df <- read.table("file.tsv", sep="\t", header=TRUE) setDT(df)
# 逐行执行KS检验并新增结果列 df[, c("pval", "hyp") := { # 提取当前行的两组数值并转为向量 group1 <- unlist(.SD[, .(A, B)]) group2 <- unlist(.SD[, .(C, D, E)]) # 执行KS检验,添加exact=FALSE避免小样本警告 res <- ks.test(group1, group2, exact = FALSE) # 返回p值和备择假设结果 .(res$p.value, as.character(res$alternative)) }, by = 1:nrow(df)]
- 如果你需要使用单侧检验,只需在
ks.test函数中添加alternative参数即可,可选值为"two.sided"(默认,双尾)、"less"、"greater"(后两者为单尾),对应输出的hyp列会自动匹配结果。 - 运行完成后直接打印
df即可得到你需要的包含pval、hyp列的结果表。
你可以用以下示例代码直接验证效果:
# 测试用示例数据构造 test_df <- read.table(text = " sno A B C D E r1 1 3 5 6 7 r2 8 9 1 5 3 r3 2 4 6 8 10 r4 11 2 3 7 6 ", header = TRUE) setDT(test_df) # 执行检验逻辑 test_df[, c("pval", "hyp") := { group1 <- unlist(.SD[, .(A, B)]) group2 <- unlist(.SD[, .(C, D, E)]) res <- ks.test(group1, group2, exact = FALSE) .(res$p.value, as.character(res$alternative)) }, by = 1:nrow(test_df)] # 查看结果 print(test_df)
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

