2012-12-05 93 views
2

我希望這不是一個騙局 - 我已經搜索了很長時間,很難找到許多類似的問題,但沒有解決我的問題。由兩列拆分表

我有一個數據框,1列包含數據,其他2列是我先前計算的分位數度量值。

set.seed(123) 
d <- data.frame(data = 100:199, quantile1 = runif(100), quantile2 = runif(100)) 
head(d) 

    data quantile1 quantile2 
1 100 0.2875775 0.5999890 
2 101 0.7883051 0.3328235 
3 102 0.4089769 0.4886130 
4 103 0.8830174 0.9544738 
5 104 0.9404673 0.4829024 
6 105 0.0455565 0.8903502 

我想智能的方式根據quantile1和quantile2列拆分數據。例如我想要quantile1爲< 0.25和quantile2> 0.5的行。我目前做這個有:

d[d[,2] < 0.25 & d[,3] > 0.5, ] 

這工作,但就是有點麻煩的,如果我有很多的子集。我想將數據分成。我期待在分裂在以下界限:

quantile1 0.25, 0.75 (three subsets) 

,然後quantile1的每個子集,進一步分裂的邊界:

quantile2 0.5 (2 subsets) 

因此產生6子集的總額。

謝謝。

回答

4

嘗試使用splitfindInterval在一起,也許是這樣的:

dsplit <- split(d, list(findInterval(d[, "quantile1"], vec=c(0, .25, .75)), 
         findInterval(d[, "quantile2"], vec=c(0, .5)))) 

這將創建6 data.framelist。前三data.frame s爲那些其中「quantile2」小於0.5,和第二三是其中它是大於5。

str(dsplit) 
# List of 6 
# $ 1.1:'data.frame': 9 obs. of 3 variables: 
# ..$ data  : int [1:9] 139 140 145 146 153 155 161 190 195 
# ..$ quantile1: num [1:9] 0.232 0.143 0.139 0.233 0.122 ... 
# ..$ quantile2: num [1:9] 0.439 0.312 0.231 0.239 0.246 ... 
# $ 2.1:'data.frame': 27 obs. of 3 variables: 
# ..$ data  : int [1:27] 102 108 109 111 112 121 122 124 126 127 ... 
# ..$ quantile1: num [1:27] 0.409 0.551 0.457 0.453 0.678 ... 
# ..$ quantile2: num [1:27] 0.4886 0.4107 0.1471 0.3012 0.0607 ... 
# $ 3.1:'data.frame': 14 obs. of 3 variables: 
# ..$ data  : int [1:14] 101 104 115 119 123 152 157 158 164 167 ... 
# ..$ quantile1: num [1:14] 0.788 0.94 0.9 0.955 0.994 ... 
# ..$ quantile2: num [1:14] 0.333 0.483 0.142 0.405 0.22 ... 
# $ 1.2:'data.frame': 17 obs. of 3 variables: 
# ..$ data  : int [1:17] 105 114 116 117 129 134 137 144 150 156 ... 
# ..$ quantile1: num [1:17] 0.0456 0.1029 0.2461 0.0421 0.1471 ... 
# ..$ quantile2: num [1:17] 0.89 0.721 0.549 0.954 0.69 ... 
# $ 2.2:'data.frame': 20 obs. of 3 variables: 
# ..$ data  : int [1:20] 100 106 113 118 125 132 135 138 160 162 ... 
# ..$ quantile1: num [1:20] 0.288 0.528 0.573 0.328 0.709 ... 
# ..$ quantile2: num [1:20] 0.6 0.914 0.948 0.585 0.984 ... 
# $ 3.2:'data.frame': 13 obs. of 3 variables: 
# ..$ data  : int [1:13] 103 107 110 120 130 131 133 136 149 166 ... 
# ..$ quantile1: num [1:13] 0.883 0.892 0.957 0.89 0.963 ... 
# ..$ quantile2: num [1:13] 0.954 0.609 0.935 0.648 0.619 ... 

可以根據在您的問題您的示例驗證所期望的輸出。

dsplit[[4]] 
# data quantile1 quantile2 
# 6 105 0.0455564994 0.8903502 
# 15 114 0.1029246827 0.7205963 
# 17 116 0.2460877344 0.5492847 
# 18 117 0.0420595335 0.9540912 
# 30 129 0.1471136473 0.6900071 
# 35 134 0.0246136845 0.5211357 
# 38 137 0.2164079358 0.7862816 
# 45 144 0.1524447477 0.8427293 
# 51 150 0.0458311667 0.8474532 
# 57 156 0.1275316502 0.5719353 
# 74 173 0.0006247733 0.7465680 
# 76 175 0.2201188852 0.6180179 
# 80 179 0.1111354243 0.5817501 
# 81 180 0.2436194727 0.8397678 
# 85 184 0.1028646443 0.5943432 
# 90 189 0.1750526503 0.9018744 
# 98 197 0.0935949867 0.6592303 

yourexample <- d[d[, 2] < 0.25 & d[,3] > 0.5, ] 
identical(dsplit[[4]], yourexample) 
# [1] TRUE 
+0

你的10K mrdwab恭喜!也注意到名稱的改變! – flodel

+0

@ flodel,謝謝。我昨天有時候打了10K ......我現在可以看到死去的帖子...... {插入瘋狂的笑聲}。 – A5C1D2H2I1M1N2O1R2T1

+0

這正是我所需要的。作爲進一步改進,我可以更改列表返回的順序嗎?我希望返回的兩個數據幀是分位數1的第一個間隔和分位數2的兩個間隔。然後,將第二個兩個數據幀分爲第二個分位點和第二個分位點。謝謝! – mchangun

2

有人可以想出一個更好的解決方案,但是這是我在類似情況下所做的:

> split(d, list(cut(d[,2], c(0,.25,.75,1)), cut(d[,3], c(0,.5,1)))) -> NewD 
> NewD     # Shows the six tables  


> lapply(NewD, nrow) # Shows the name/size of each resulting data frame 
$`(0,0.25].(0,0.5]` 
[1] 9 

$`(0.25,0.75].(0,0.5]` 
[1] 27 

$`(0.75,1].(0,0.5]` 
[1] 14 

$`(0,0.25].(0.5,1]` 
[1] 17 

$`(0.25,0.75].(0.5,1]` 
[1] 20 

$`(0.75,1].(0.5,1]` 
[1] 13 

split函數創建一個基於標準的一個list中的新數據幀在第二個參數(在這個例子中是一個列表)。 cut函數將一個向量劃分爲用戶指定的時間間隔(如果需要,也可以是等間隔的時間間隔)。

您可以用names(NewD) <- c("A", "B", "C", "D", "E", "F")之類的東西重新命名這些數據幀。

1

我傾向於使用plyr進行分割,因爲它非常環保,並且爲將來的繪圖數據準備ggplot2數據。

1)倉quatile1,使用類似尺寸的quantile2組切

 dat$qt1 <- cut(dat$quantile1,c(0,0.25,0.75,1),include.lowest=TRUE) 
    dat$qt2 <- cut(dat$quantile2,c(0,0.5,1),include.lowest=TRUE) 

2)I使用熔體使用我的離散標識符(QT1,QT2)

 library(reshape2) 
    mm <- melt(dat,measure.vars='data') 

現在我可以重塑數據玩我熔化的數據,例如。G:

acast(mm,qt1~qt2) 
Aggregation function missing: defaulting to length 
      [0,0.5] (0.5,1] 
[0,0.25]   9  18 
(0.25,0.75]  26  22 
(0.75,1]   18  7 

或者我可以使用ggplot繪製數據:

library(ggplot2) 
ggplot(data=mm)+geom_bar(aes(x=qt1,fill=qt2,group=qt2),position='dodge') 

enter image description here