2012-11-07 2 views
1

나는 다음과 같은 데이터 프레임이 있습니다열 내용을 이용하여 데이터 프레임을 서브 세트

Test <- data.frame(Species = c("A","B","C","D"), 
     WB1=c(0.1,1.1,0.9,1.2), 
     WB2=c(1, 0.8, 1.3, 1), 
     WB3=c(0.5, 0.7, 1.2, 0.9), 
     WB4=c(1.3, 1.2, 0.9, 0.6)) 

을 그리고 난 단지보다 라거있는 WB's을 나열 종마다 새로운 데이터 프레임을 좀하고 싶습니다. 종 A이 예 그래서 그 다음 내가 시도

WB1 WB4 
1.0 1.3 

것 :

AllSpecies <- Test$Species 
AllWaterbodies <- colnames(Test) 
for(species in AllSpecies) 
{ 
    ind <- which(Test$Species == species) 
    x <- Test[ind,] 
    colnames(x) <- AllWaterbodies 

species <- "A"을 말한다면,이보다 이미 나에게 줄 것입니다 :

Species WB1 WB2 WB3 NA 
1  A 0.1 1 0.5 1.3 

지금은 하나보다 큰 WB's만을 나열하고 싶습니다. 그리고 이것이 내가 붙어있는 곳입니다. 어떤 몸이라도 루프를 완성 할 수 있습니까?

답변

3

: Beasterfield의하지만 추가 패키지를 설치할 필요가 없습니다 @로

lapply(split(Test[,-1], Test$Species), function(x) x[which(x>1)]) 
$A 
    WB4 
1 1.3 

$B 
    WB1 WB4 
2 1.1 1.2 

$C 
    WB2 WB3 
3 1.3 1.2 

$D 
    WB1 
4 1.2 

같은 결과.

lapply(split(Test[,-1], Test$Species), function(x) x[which(x>=1)]) 
$A 
    WB2 WB4 
1 1 1.3 

$B 
    WB1 WB4 
2 1.1 1.2 

$C 
    WB2 WB3 
3 1.3 1.2 

$D 
    WB1 WB2 
4 1.2 1 
+0

솔직히 말해서, 나는 'split'을 인식하지 못했습니다. – Beasterfield

2

원하는대로 할 수 있습니까?

library("plyr") 
dlply(Test, "Species", function(x){ 
    x[ ,c(F, x[,2:5] > 1), drop = FALSE ] 
}) 

출력 :는 R 기반 솔루션 lapply를 사용

$A 
    WB4 
1 1.3 

$B 
    WB1 WB4 
2 1.1 1.2 

$C 
    WB2 WB3 
3 1.3 1.2 

$D 
    WB1 
4 1.2 
1

여기입니다 : 당신이 1보다 큰 값을 요구하지만, 원하는 출력하고

당신은 어쩌면 당신이 찾고있는 코드는 다음과 같다, 1 값이 크거나 보여 두 줄 ...
원하는 종마다 하나의 data.frame을 포함하는 results이라는 목록이 생성됩니다.
각 데이터 프레임은 원본 프레임 인 Test의 해당 행의 하위 집합이며> = 1.0 필터를 통과하는 열만 유지됩니다. 우리가 모든 종을하고자 할 때 우리는 명시 적 목록보다는 for (spc in Test[, "Species"])을 사용할 수 있습니다 물론

results <- list() 
for (spc in c('A', 'B', 'C', 'D')) 
    results[[spc]] <- Test[Test$Species==spc, 
          c(TRUE, Test[Test$Species==spc, -1] >= 1.0)] 

> results 
$A 
    Species WB2 WB4 
1  A 1 1.3 
$B 
    Species WB1 WB4 
2  B 1.1 1.2 
$C 
    Species WB2 WB3 
3  C 1.3 1.2 
$D 
    Species WB1 WB2 
4  D 1.2 1 

.
또한 스 니펫을 조정하여 목록의 요소에 대한 더 멋진 이름을 지정하거나 개별 데이터에서 Species 열을 제외 할 수 있습니다. 예.

> results <- list() 
> for (spc in c('A', 'C')) 
    results[[paste("Record for Species", spc)]] <- 
      Test[Test$Species==spc, 
       c(FALSE , Test[Test$Species==spc, -1] >= 1.0)] 
> results 
$`Record for Species A` 
    WB2 WB4 
1 1 1.3 

$`Record for Species C` 
    WB2 WB3 
3 1.3 1.2 
관련 문제