2013-05-08 4 views
0

배경 : 중복 값이있는 하나의 열이있는 데이터 프레임이 있습니다. 중복 열 값을 가진 모든 행을 선택하여 처리 한 다음 처리 된 모든 행을 사용하여 새 데이터 프레임을 추출하여이 데이터 프레임을 분할하려고합니다. (10 개) 레코드가에있을 때,고유 한 열 값에 대한 하위 집합 데이터 프레임의 동작

dataSet <- structure(list(DAY = structure(1:10, .Label = c("Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday"), class = "factor"), 
     variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L), .Label = c("act1", "act2", "act3", "act4", 
     "act5", "act12", "act19", "act116", "act22", 
     "act6", "act13", "act111", "act117", "act23", 
     "act7", "act14", "act112", "act118", "act24", 
     "act8", "act15", "act113", "act119", "act25", 
     "act9", "act16", "act114", "act20", "act26", 
     "act10", "act17", "act115", "act21", "act27", 
     "act11", "act18"), class = "factor"), value = c(67, 
     65, 40, 79, 106, 90, 57, 59, 2, 12)), .Names = c("DAY", 
    "variable", "value"), row.names = c(NA, 10L), class = "data.frame") 


uniq <- unique(dataSet$variable) 
for (i in 1:length(uniq)){ 
    rowsPerVal <- dataSet[dataSet$variable == uniq[i], ] 
    print(length(rowsPerVal)) 
} 

난 그냥 최종 인쇄 문은 길이가 3 말합니다 이해가 안 돼요 :

는 다음 코드에서 잘못된 여기에 무슨 일이 일어나고 있는지에 관해서 놀랐다 variable 열과 동일한 값을 가진 데이터 프레임

+3

데이터 프레임의 '길이'는 실제로 목록이므로 열의 수입니다. 너는 아마도 '비켜서'또는 어떤 것을 의미했을 것이다. – joran

+0

음, 예제에서는 "uniq"에 하나의 값만 있습니다. 그것은 당신의 문제를 설명하기에 충분합니까? 오, 신경 쓰지 마세요, 조란 말이 맞아요. 대신에'print (nrow (...))'를 써라. 아니면 그냥'print (sum (dataSet $ ​​variable == uniq [i]))'를 호출하고 위의 행을 건너 뜁니다. 루핑하지 않고도이를 수행 할 수있는 방법은 분명합니다. – Frank

답변

3

plyr는 위해도 좋은이 분할 결합 신청 (덩어리로 설정 분할 데이터를 하나 하나에서 작동하고, 다시 함께 넣어) 문제. 다른 사람들은 data.framelength() 말했듯이

library("plyr") 
ddply(dataSet, .(variable), nrow) 

컬럼의 숫자이고; nrow()은 행 수입니다.

> ddply(dataSet, .(variable), nrow) 
    variable V1 
1  act1 10 

당신은 당신이 원하는대로 처리 않는 (익명) 기능 nrow를 교체 할 수 있습니다.

1

duplicated은 2 번째 항목에 대해서만 TRUE를 반환합니다. 당신이 처리 만 할 수

dataSet[duplicated(dataSet$variable),]$value <- NA 
> dataSet 
     DAY variable value 
1 Tuesday  act1 67 
2 Tuesday  act1 NA 
3 Tuesday  act1 NA 
4 Tuesday  act1 NA 
5 Tuesday  act1 NA 
6 Tuesday  act1 NA 
7 Tuesday  act1 NA 
8 Tuesday  act1 NA 
9 Tuesday  act1 NA 
10 Tuesday  act1 NA 

는 "모든 처리 된 행과 새로운 데이터 프레임을 뱉어"하려면, 당신은 또한 그들에게 할당 할 수

dataSet[duplicated(dataSet$variable),] 

: 그래서 당신은 당신의 행 인덱스로 사용할 수 있습니다 서브 세트 data.frame 그러나 당신이 좋아 :

newDF <- transform(dataSet[duplicated(dataSet$variable),], DAY=sub("esd","foo",DAY)) 
+0

이것이 질문과 어떤 관련이 있는지 모르겠다. –

+0

@BrianDiggs Question은 다소 모호하지만 "중복 된 열 값을 가진 모든 행을 선택하여이 데이터 프레임을 나눕니다"는 필자가 집중적으로 사용한 것입니다. 나는 그의 두 번째 작품 인'모든 처리 된 행으로 새로운 데이터 프레임을 뱉어 내라. '에 정확하게 대답하기 위해 대답을 바꿀 것입니다. –

+0

내 중복은 그룹의 모든 행을 식별하지 못하도록하는 'duplicated'와 관련이 있습니다 (그룹당 하나의 행이없고 모든 보조 행이 단일 그룹으로 묶여 있음). 귀하의 편집 내용은 제가 요점이라고 생각했던 것을 처리합니다. 투표 취소 : –

관련 문제