2012-07-06 3 views

답변

12

aggregate 기능이 도움이 될 것입니다 솔루션을 찾는 중 :

dat = data.frame(title = c("title1", "title2", "title3"), 
       author = c("author1", "author2", "author3"), 
       customerID = c(1, 2, 1)) 
aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1 title author 
# 1  1 1, 3 1, 3 
# 2  2  2  2 

또는 데이터 프레임을 만들 때 stringsAsFactors = FALSE을 추가하면 꽤 좋습니다.

aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1   title   author 
# 1  1 title1, title3 author1, author3 
# 2  2   title2   author2 
+0

고마워요! –

+0

@HarryPalmer, 후속 질문을 이해할 수 있는지 잘 모르겠습니다. 'temp'와 같은 다른 객체에'aggregate'의 출력을 할당했다고 가정하면'temp $ title'은리스트입니다 ('list ('0' = c ("title1", "title3"), 이 예제의'title'과'author' 컬럼은리스트입니다. – A5C1D2H2I1M1N2O1R2T1

+0

흠, 이제 고맙다고 생각합니다. 데이터 타입에 대해 혼란 스러웠습니다. 질문 : 제발 집계 후에 열/행 목록 요소에 나타나는 중복을 제거 할 수 있습니까? data1 <- unique (data2 $ title)을 시도했지만 이상하게 작동하지 않았습니다. –

1

하지 최상의 솔루션하지만 쉽게 이해하기 :

df <- data.frame(author=LETTERS[1:5], title=LETTERS[1:5], id=c(1, 2, 1, 2, 3), stringsAsFactors=FALSE) 

uniqueIds <- unique(df$id) 

mergedDf <- df[1:length(uniqueIds),] 

for (i in seq(along=uniqueIds)) { 
    mergedDf[i, "id"] <- uniqueIds[i] 
    mergedDf[i, "author"] <- paste(df[df$id == uniqueIds[i], "author"], collapse=",") 
    mergedDf[i, "title"] <- paste(df[df$id == uniqueIds[i], "title"], collapse=",") 
} 

mergedDf 
# author title id 
#1 A,C A,C 1 
#2 B,D B,D 2 
#3  E  E 3 
+0

이 좋은,하지만 R은 그룹화 된 데이터를 처리하기위한 몇 가지 붙박이 기능이 있습니다 데이터가 이미 고려하는 경우, 다음, 첫 번째 문자로 변환하는 dat[c(1, 2)] = apply(dat[-3], 2, as.character) 같은 것을 사용할 수 있습니다. 이 경우에 가장 좋은 방법은'aggregate (df [-3], by = list (df $ id), c)'이지만'df (-3), df $ id, c '에 의해서도 마찬가지이다. 결과, 완전히 다른 형식으로. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab : thx, 나는 자주 데이터 프레임을 사용하지 않고'aggregate' 함수를 모른다. – sgibb

관련 문제