2012-10-29 162 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“)] - ”一个“。 –