在 R 中按列在两个数据帧之间应用函数 (ks.test)
Applying function (ks.test) between two data frames colum-wise in R
我的简单问题是:如何在两个数据框之间逐列执行 ks.test
?
例如。我们有两个数据框:
D1 <- data.frame(D$Ag, D$Al, D$As, D$Ba, D$Be, D$Ca, D$Cd, D$Co, D$Cu, D$Cr)
D2 <- data.frame(S$Ag, S$Al, S$As, S$Ba, S$Be, S$Ca, S$Cd, S$Co, S$Cu, S$Cr)
注意:这只是一个示例 - 实际情况会包含更多的列,并且它们包含特定元素在特定位置的浓度。
现在我想 运行 在两个数据帧之间 ks.test :
ks.test(D$Ag, S$Ag)
ks.test(D$Al, S$Al)
ks.test(D$As, S$As)
等不做奴隶制工作是怎么做到的?
当我在一个数据框上做 shapiro.test 时,我简单地使用:
lshap1 <- lapply(D1, shapiro.test)
lres1 <- sapply(lshap1, `[`, c("statistic","p.value"))
我读过一些关于循环、聚合、mapply 的东西 - 尝试过不同的东西,比如:
apply(D1, 2, function(D2) ks.test(D2,D1[,1])$p.value)
但后来我得到很多 p 值 = 0..。当我手动执行时情况并非如此。
编辑:2017 年 10 月 9 日
我将数据导入为两个数据框,然后将一些数据提取到 "smaller" 数据框进行分析 - 例如在这种情况下,查看有毒元素并排除其他元素。
示例数据:dput(head(D1))
和 dput(head(D2))
。
## Output dput(head(D1)):
structure(list(DF.As = c(-0.154868225169351, -0.291459578010276,
0.0355227595866723, 0.0892191549433623, 0.189115121672669,
-0.365222418641706
), DF.Cd = c(1.28810277421719, 1.45844987179892, 0.642331353138319,
0.673164023466527, 0.131548822144598, 0.146964746525726), DF.Cu
c(8.01131080231879,
6.52606822875086, 2.93449454196807, 4.08720148249298, 1.55494291704341,
1.73663851851503), DF.Cr = c(0.164849379809527, 0.196759436988158,
0.307645386162046, 0.302917612808149, 0.187202322026229, 0.25358922601195
), DF.Ni = c(0.362592459542858, 0.527078409257359, 0.477116357433909,
0.469287608844157, 0.225865184678244, 0.355321456594576), DF.Pb
c(0.414448963979605,
0.616598678960665, -0.0531899082482045, 0.47477978516042,
0.422106471495816,
0.0326241032568164), DF.Zn = c(74.7657982668, 74.2978919524635,
36.6575117549406, 47.8440365300156, 21.4962811912273, 23.3823413091772
)), .Names = c("DF.As", "DF.Cd", "DF.Cu", "DF.Cr", "DF.Ni", "DF.Pb",
"DF.Zn"), row.names = c(NA, 6L), class = "data.frame")
## Output dput(head(D2)):
structure(list(DO.As = c(0.0150158517208966, -0.0477743050574027,
-0.121541780066373, -0.0376195600535572, 0.115393920133327,
0.265450918075612), DO.Cd = c(0.367936811743133, 0.445545318262818,
0.350071986298948,
0.331513644782201, 0.603874629105229, 0.598527030667747), DO.Cu
c(1.65127139067621,
1.90306634226191, 1.08280240161368, 1.12130376047927, 1.23137174481965,
1.16618813144813), DO.Cr = c(0.162996340978278, 0.493799568371693,
0.18441814919492, 0.179883906525139, 0.128058190333676, 0.030406737049484
), DO.Ni = c(0.290717040452464, 0.331891307317008, 0.387987078391917,
0.36147470695146, 0.774910299821917, 0.323259411199816), DO.Pb
c(-0.0584055598838365,
0.377799120780818, -0.0741768575020139, 0.511278669452117,
0.320822577941608, 0.250377389869303), DO.Zn = c(16.5625482436821,
14.5084409384572, 16.571001044493, 18.4509635406253, 15.6876446591721,
12.7649440587945)), .Names = c("DO.As", "DO.Cd", "DO.Cu", "DO.Cr", "DO.Ni",
"DO.Pb", "DO.Zn"), row.names = c(NA, 6L), class = "data.frame")
我发布这个是因为我仍然收到错误消息:
## This is code for execution:
col.names = colnames(D1)
lapply(col.names, function(t, d1, d2){ks.test(d1[, t], d2[, t])}, D1, D2)
## Output:
Error in `[.data.frame`(d2, , t) : undefined columns chosen
(回溯按钮显示):
6.stop("undefined columns selected")
5.`[.data.frame`(d2, , t)
4.d2[, t]
3.ks.test(d1[, t], d2[, t])
2.FUN(X[[i]], ...)
1.lapply(col.names, function(t, d1, d2) {ks.test(d1[, t], d2[, t])}, D1, D2)
使用一些随机数和相同的列名创建了两个 data.frames D1
和 D2
。
set.seed(12)
D1 = data.frame(A=rnorm(n = 30,mean = 5,sd = 2.5),B=rnorm(n = 30,mean = 4.5,sd = 2.2),C=rnorm(n = 30,mean = 2.5,sd = 12))
D2 = data.frame(A=rnorm(n = 30,mean = 5,sd = 2.49),B=rnorm(n = 30,mean = 4.4,sd = 2.2),C=rnorm(n = 30,mean = 2,sd = 12))
现在我们可以使用列名循环传递给D1
和D2
对各自data.frames对应的列进行ks.test
.
col.names = colnames(D1)
lapply(col.names,function(t,d1,d2){ks.test(d1[,t],d2[,t])},D1,D2)
#[[1]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.167, p-value = 0.81
#alternative hypothesis: two-sided
#[[2]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.233, p-value = 0.39
#alternative hypothesis: two-sided
#[[3]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.2, p-value = 0.59
#alternative hypothesis: two-sided
在您在问题描述中使用的符号中,理想情况下,以下代码应该有效:
col.names =colnames(S)
lapply(col.names,function(t,d1,d2){ks.test(d1[,t],d2[,t])},D,S)
使用 purrr
package together with tidy
function from the broom
包
中的 map
函数的 tidyverse
解决方案
library(purrr)
library(broom)
# Data posted by @TUSHAr
set.seed(12)
D1 <- data.frame(A = rnorm(n = 30, mean = 5, sd = 2.5),
B = rnorm(n = 30, mean = 4.5, sd = 2.2),
C = rnorm(n = 30, mean = 2.5, sd = 12))
D2 <- data.frame(A = rnorm(n = 30, mean = 5, sd = 2.49),
B = rnorm(n = 30, mean = 4.4, sd = 2.2),
C = rnorm(n = 30, mean = 2, sd = 12))
# Loop through each column
result <- colnames(D1) %>%
set_names() %>%
# apply `ks.test` function for each column pair
map(~ ks.test(D1[, .x], D2[, .x])) %>%
# extract test results using `tidy` then bind them together by rows
map_dfr(., broom::tidy, .id = "parameter")
result
#> # A tibble: 3 x 5
#> parameter statistic p.value method alternative
#> <chr> <dbl> <dbl> <chr> <chr>
#> 1 A 0.167 0.808 Two-sample Kolmogorov-Smirnov t~ two-sided
#> 2 B 0.2 0.594 Two-sample Kolmogorov-Smirnov t~ two-sided
#> 3 C 0.233 0.393 Two-sample Kolmogorov-Smirnov t~ two-sided
由 reprex package (v0.2.0.9000) 创建于 2018-08-24。
我的简单问题是:如何在两个数据框之间逐列执行 ks.test
?
例如。我们有两个数据框:
D1 <- data.frame(D$Ag, D$Al, D$As, D$Ba, D$Be, D$Ca, D$Cd, D$Co, D$Cu, D$Cr)
D2 <- data.frame(S$Ag, S$Al, S$As, S$Ba, S$Be, S$Ca, S$Cd, S$Co, S$Cu, S$Cr)
注意:这只是一个示例 - 实际情况会包含更多的列,并且它们包含特定元素在特定位置的浓度。
现在我想 运行 在两个数据帧之间 ks.test :
ks.test(D$Ag, S$Ag)
ks.test(D$Al, S$Al)
ks.test(D$As, S$As)
等不做奴隶制工作是怎么做到的?
当我在一个数据框上做 shapiro.test 时,我简单地使用:
lshap1 <- lapply(D1, shapiro.test)
lres1 <- sapply(lshap1, `[`, c("statistic","p.value"))
我读过一些关于循环、聚合、mapply 的东西 - 尝试过不同的东西,比如:
apply(D1, 2, function(D2) ks.test(D2,D1[,1])$p.value)
但后来我得到很多 p 值 = 0..。当我手动执行时情况并非如此。
编辑:2017 年 10 月 9 日 我将数据导入为两个数据框,然后将一些数据提取到 "smaller" 数据框进行分析 - 例如在这种情况下,查看有毒元素并排除其他元素。
示例数据:dput(head(D1))
和 dput(head(D2))
。
## Output dput(head(D1)):
structure(list(DF.As = c(-0.154868225169351, -0.291459578010276,
0.0355227595866723, 0.0892191549433623, 0.189115121672669,
-0.365222418641706
), DF.Cd = c(1.28810277421719, 1.45844987179892, 0.642331353138319,
0.673164023466527, 0.131548822144598, 0.146964746525726), DF.Cu
c(8.01131080231879,
6.52606822875086, 2.93449454196807, 4.08720148249298, 1.55494291704341,
1.73663851851503), DF.Cr = c(0.164849379809527, 0.196759436988158,
0.307645386162046, 0.302917612808149, 0.187202322026229, 0.25358922601195
), DF.Ni = c(0.362592459542858, 0.527078409257359, 0.477116357433909,
0.469287608844157, 0.225865184678244, 0.355321456594576), DF.Pb
c(0.414448963979605,
0.616598678960665, -0.0531899082482045, 0.47477978516042,
0.422106471495816,
0.0326241032568164), DF.Zn = c(74.7657982668, 74.2978919524635,
36.6575117549406, 47.8440365300156, 21.4962811912273, 23.3823413091772
)), .Names = c("DF.As", "DF.Cd", "DF.Cu", "DF.Cr", "DF.Ni", "DF.Pb",
"DF.Zn"), row.names = c(NA, 6L), class = "data.frame")
## Output dput(head(D2)):
structure(list(DO.As = c(0.0150158517208966, -0.0477743050574027,
-0.121541780066373, -0.0376195600535572, 0.115393920133327,
0.265450918075612), DO.Cd = c(0.367936811743133, 0.445545318262818,
0.350071986298948,
0.331513644782201, 0.603874629105229, 0.598527030667747), DO.Cu
c(1.65127139067621,
1.90306634226191, 1.08280240161368, 1.12130376047927, 1.23137174481965,
1.16618813144813), DO.Cr = c(0.162996340978278, 0.493799568371693,
0.18441814919492, 0.179883906525139, 0.128058190333676, 0.030406737049484
), DO.Ni = c(0.290717040452464, 0.331891307317008, 0.387987078391917,
0.36147470695146, 0.774910299821917, 0.323259411199816), DO.Pb
c(-0.0584055598838365,
0.377799120780818, -0.0741768575020139, 0.511278669452117,
0.320822577941608, 0.250377389869303), DO.Zn = c(16.5625482436821,
14.5084409384572, 16.571001044493, 18.4509635406253, 15.6876446591721,
12.7649440587945)), .Names = c("DO.As", "DO.Cd", "DO.Cu", "DO.Cr", "DO.Ni",
"DO.Pb", "DO.Zn"), row.names = c(NA, 6L), class = "data.frame")
我发布这个是因为我仍然收到错误消息:
## This is code for execution:
col.names = colnames(D1)
lapply(col.names, function(t, d1, d2){ks.test(d1[, t], d2[, t])}, D1, D2)
## Output:
Error in `[.data.frame`(d2, , t) : undefined columns chosen
(回溯按钮显示):
6.stop("undefined columns selected")
5.`[.data.frame`(d2, , t)
4.d2[, t]
3.ks.test(d1[, t], d2[, t])
2.FUN(X[[i]], ...)
1.lapply(col.names, function(t, d1, d2) {ks.test(d1[, t], d2[, t])}, D1, D2)
使用一些随机数和相同的列名创建了两个 data.frames D1
和 D2
。
set.seed(12)
D1 = data.frame(A=rnorm(n = 30,mean = 5,sd = 2.5),B=rnorm(n = 30,mean = 4.5,sd = 2.2),C=rnorm(n = 30,mean = 2.5,sd = 12))
D2 = data.frame(A=rnorm(n = 30,mean = 5,sd = 2.49),B=rnorm(n = 30,mean = 4.4,sd = 2.2),C=rnorm(n = 30,mean = 2,sd = 12))
现在我们可以使用列名循环传递给D1
和D2
对各自data.frames对应的列进行ks.test
.
col.names = colnames(D1)
lapply(col.names,function(t,d1,d2){ks.test(d1[,t],d2[,t])},D1,D2)
#[[1]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.167, p-value = 0.81
#alternative hypothesis: two-sided
#[[2]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.233, p-value = 0.39
#alternative hypothesis: two-sided
#[[3]]
#Two-sample Kolmogorov-Smirnov test
#data: d1[, t] and d2[, t]
#D = 0.2, p-value = 0.59
#alternative hypothesis: two-sided
在您在问题描述中使用的符号中,理想情况下,以下代码应该有效:
col.names =colnames(S)
lapply(col.names,function(t,d1,d2){ks.test(d1[,t],d2[,t])},D,S)
使用 purrr
package together with tidy
function from the broom
包
map
函数的 tidyverse
解决方案
library(purrr)
library(broom)
# Data posted by @TUSHAr
set.seed(12)
D1 <- data.frame(A = rnorm(n = 30, mean = 5, sd = 2.5),
B = rnorm(n = 30, mean = 4.5, sd = 2.2),
C = rnorm(n = 30, mean = 2.5, sd = 12))
D2 <- data.frame(A = rnorm(n = 30, mean = 5, sd = 2.49),
B = rnorm(n = 30, mean = 4.4, sd = 2.2),
C = rnorm(n = 30, mean = 2, sd = 12))
# Loop through each column
result <- colnames(D1) %>%
set_names() %>%
# apply `ks.test` function for each column pair
map(~ ks.test(D1[, .x], D2[, .x])) %>%
# extract test results using `tidy` then bind them together by rows
map_dfr(., broom::tidy, .id = "parameter")
result
#> # A tibble: 3 x 5
#> parameter statistic p.value method alternative
#> <chr> <dbl> <dbl> <chr> <chr>
#> 1 A 0.167 0.808 Two-sample Kolmogorov-Smirnov t~ two-sided
#> 2 B 0.2 0.594 Two-sample Kolmogorov-Smirnov t~ two-sided
#> 3 C 0.233 0.393 Two-sample Kolmogorov-Smirnov t~ two-sided
由 reprex package (v0.2.0.9000) 创建于 2018-08-24。