2012-10-29 363 views
4

我有很長的數據幀是這樣的:拆分數據幀由

Row Conc group 
    1  2.5 A 
    2  3.0 A 
    3  4.6 B 
    4  5.0 B 
    5  3.2 C 
    6  4.2 C 
    7  5.3 D 
    8  3.4 D 

...

的實際數據有幾百行。我想將A分成C,D以後我查了網,發現了幾個解決方案,但不適用於我的案例。

How to split a data frame?

例如: 案例1:

x = data.frame(num = 1:26, let = letters, LET = LETTERS) 
set.seed(10) 
split(x, sample(rep(1:2, 13))) 

我不想通過任意數量的分裂

案例2:水平/因子分解

data2 <- data[data$sum_points == 2500, ] 

我不想被一個因素分裂。有時我想將許多層次結合在一起。

案例3:行號

newdf <- mydf[1:3,] 

的實際數據選擇有數百行。我不知道行號。我只知道我想要分裂的水平。

回答

3

這聽起來像你想要兩個數據幀,其中一個有(A,B,C),其中一個只有D。在這種情況下,你可以做

Data1 <- subset(Data, group %in% c("A","B","C")) 
Data2 <- subset(Data, group=="D") 

糾正我,如果你問不同的東西

+8

我想也許'split(dat,dat $ group =='D')'就足夠了。 – joran

+0

我想也許這是一回事。 –

+4

它(有點)達到相同的結果,但更習慣,只需要一行,並方便地返回在一個單一的數據結構中的兩部分。一般來說,你應該更喜歡使用'split'。 – joran

0

您可以考慮使用recode()功能從「汽車」包。

# Load the library and make up some sample data 
library(car) 
set.seed(1) 
dat <- data.frame(Row = 1:100, 
        Conc = runif(100, 0, 10), 
        group = sample(LETTERS[1:10], 100, replace = TRUE)) 

目前,dat$group包含大寫字母A至J.假設我們想要的以下四組:

  • 「一」= A,B,C
  • 「二」= d ,E,J
  • 「三」= F,I
  • 「四」= G,H

現在,使用recode()(注意分號和嵌套引號)。

recodes <- recode(dat$group, 
       'c("A", "B", "C") = "one"; 
        c("D", "E", "J") = "two"; 
        c("F", "I") = "three"; 
        c("G", "H") = "four"') 
split(dat, recodes) 
+0

如果您能夠直接使用關卡,您並不需要汽車套件,它只會節省從「水平」(dat $ group)[levels(dat $ group)%in%c(「 A「,」B「,」C「)] - 」一個「。 –