2017-10-06 110 views
1

我的一個簡單問題是:你如何做兩個數據幀之間的ks.test。在R中的兩個數據幀之間進行操作

例如,我們有兩個數據幀:

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")) 

我所讀過的東西ABOT循環,骨料,mapply - 嘗試不同的東西,如:

apply(D1, 2, function(D2) ks.test(D2,D1[,1])$p.value) 

但後來我得到了很多p值= 0 ..當我手動執行時,情況並非如此。我將數據導入爲兩個數據幀,然後將一些數據提取到「較小」的數據幀中進行分析 - 例如,在這種情況下查看有毒元素並排除其他元素。

這是dput(head(D1))和dput(head(D2))的輸出是一個較小的數據幀。

D1 <- data.frame(DF$As,DF$Cd,DF$Cu,DF$Cr,DF$Ni,DF$Pb,DF$Zn) 
D2 <- data.frame(DO$As,DO$Cd,DO$Cu,DO$Cr,DO$Ni,DO$Pb,DO$Zn) 
##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) 
+0

*注:我的主要目標是做用KS兩個數據集的分佈比較.test - 比較第1列和第1,2和第2,3和3列等等... –

回答

1

創建了兩個data.frames D1D2一些隨機數和相同的列名稱。

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)) 

現在我們可以通過使用列名中循環,並把它傳遞給D1D2執行在各自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) 
+0

請問您能解釋一下這一行的作用: lapply(col.names,function(t,d1,d2){ks.test (d1 [,t],d2 [,t])},D1,D2) –

+0

我得到一個錯誤:「undefined columns selected」 但是當我問D1 [,T]我得到列表... mystical –

+0

@lb Nemer:首先't'是小寫(D1 [,t])。 'col.names'具有所有列的名稱(在D1和D2中都是相同的)。所以你通過col循環。名稱,就像for循環一樣,子集D1和D2使用列名作爲D1 [,t]'和'D2 [,t]',並在'ks.test'函數中使用它們。我沒有收到任何錯誤,因爲我已經用完整的代碼複製了這個例子。也許你應該檢查你所使用的兩個data.frames的列名是否相同。 – TUSHAr

相關問題