2014-01-30 3 views
1

두 개의 열이있는 데이터 프레임이 있습니다. 하나는 문자열이고 다른 하나는 정수입니다.R : C와 집계 문자열

> rnames = sapply(1:20, FUN=function(x) paste("item", x, sep=".")) 
> x <- sample(c(1:5), 20, replace = TRUE) 
> df <- data.frame(x, rnames) 
> df 
    x rnames 
1 5 item.1 
2 3 item.2 
3 5 item.3 
4 3 item.4 
5 1 item.5 
6 3 item.6 
7 4 item.7 
8 5 item.8 
9 4 item.9 
10 5 item.10 
11 5 item.11 
12 2 item.12 
13 2 item.13 
14 1 item.14 
15 3 item.15 
16 4 item.16 
17 5 item.17 
18 4 item.18 
19 1 item.19 
20 1 item.20 

나는 'C'또는 '목록'기능을 문자열 (문자)의 목록에 문자열이나 벡터를 집계하려고하지만지고있어 이상한 결과 :

> aggregate(rnames ~ x, df, c) 
    x    rnames 
1 1  16, 6, 11, 13 
2 2    4, 5 
3 3  12, 15, 17, 7 
4 4  18, 20, 8, 10 
5 5 1, 14, 19, 2, 3, 9 

I을 'c'대신 'paste'를 사용하면 집계가 올바르게 작동하는 것을 볼 수 있습니다. 그러나 결과는 내가 찾고있는 것이 아닙니다.

> aggregate(rnames ~ x, df, paste) 
    x           rnames 
1 1     item.5, item.14, item.19, item.20 
2 2         item.12, item.13 
3 3     item.2, item.4, item.6, item.15 
4 4     item.7, item.9, item.16, item.18 
5 5 item.1, item.3, item.8, item.10, item.11, item.17 

은 내가 찾고 내가 '붙여 넣기'로지고있어 단일 문자열이 아닌 모든 집계 그룹은 벡터 또는 조명 (C의 따라서 사용)로 제공 될 것입니다. 다음의 라인을 따라 뭔가가 (현실에서 작동하지 않는) :

> aggregate(rnames ~ x, df, c) 
    x           rnames 
1 1     item.5, item.14, item.19, item.20 
2 2         item.12, item.13 
3 3     item.2, item.4, item.6, item.15 
4 4     item.7, item.9, item.16, item.18 
5 5 item.1, item.3, item.8, item.10, item.11, item.17 

어떤 도움을 주시면 감사하겠습니다.

답변

5

당신은 data.frame의 일반적인 함정에 빠졌다 : 캐릭터 열, 그것은 요소 열 문자 열입니다하지 않습니다! 따라서 숫자 대신 당신의 결과의 문자 :

> rnames = sapply(1:20, FUN=function(x) paste("item", x, sep=".")) 
> x <- sample(c(1:5), 20, replace = TRUE) 
> df <- data.frame(x, rnames) 
> str(df) 
'data.frame': 20 obs. of 2 variables: 
$ x  : int 2 5 5 5 5 4 3 3 2 4 ... 
$ rnames: Factor w/ 20 levels "item.1","item.10",..: 1 12 14 15 16 17 18 19 20 2 ... 

요인에 변환을 방지하려면, data.frame에 호출에 인수 stringAsFactors=FALSE를 사용

> df <- data.frame(x, rnames,stringsAsFactors=FALSE) 
> str(df) 
'data.frame': 20 obs. of 2 variables: 
$ x  : int 5 5 3 5 5 3 2 5 1 5 ... 
$ rnames: chr "item.1" "item.2" "item.3" "item.4" ... 
> aggregate(rnames ~ x, df, c) 
    x                    rnames 
1 1               item.9, item.13, item.17 
2 2                    item.7 
3 3                item.3, item.6, item.19 
4 4               item.12, item.15, item.16 
5 5 item.1, item.2, item.4, item.5, item.8, item.10, item.11, item.14, item.18, item.20 

또 다른 해결책을 요인이되는 전환을 피하기 위해 기능 I :

> df <- data.frame(x, I(rnames)) 
> str(df) 
'data.frame': 20 obs. of 2 variables: 
$ x  : int 3 5 4 5 4 5 3 3 1 1 ... 
$ rnames:Class 'AsIs' chr [1:20] "item.1" "item.2" "item.3" "item.4" ... 

발췌 ?I에서 :

In function data.frame. 의 I()로 객체를 보호하면 data.frame을 호출하면 문자 벡터를 인수로 변환하고 이름을 삭제하는 것을 방지하고 행렬을 이 단일 열로 삽입되도록합니다.또한 데이터 프레임에 추가 할 객체 을 보호하거나 as.data.frame을 통해 데이터 프레임 으로 변환 할 수 있습니다.

클래스 "AsIs"를 객체의 클래스 앞에 붙임으로써이 작업을 수행 할 수 있습니다. "AsIs"클래스에는 [ as.data.frame, 인쇄 및 형식]을 비롯한 몇 가지 자체 메서드가 있습니다.

+0

차가움. 나는 뭔가를 배웠다! :-) – DataWookie

2

정확히 무엇이 당신이 찾고 있는지 확실하지 않습니다 ... 그래서 아마도 우리가 목표로하는 것에 대한 아이디어를 줄 수있는 참조 산출물이 있습니까?

하지만, 코드의 마지막 비트가 당신이 후에 무엇에 가까운 것으로 보이기 때문에, 아마도 다음과 같은 솔루션이 작동 것이다 :

> library(plyr) 
> ddply(df, .(x), summarize, rnames = paste(rnames, collapse = "|")) 
    x           rnames 
1 1       item.9|item.11|item.20 
2 2     item.1|item.2|item.15|item.16 
3 3         item.7|item.8 
4 4   item.4|item.5|item.6|item.12|item.13 
5 5 item.3|item.10|item.14|item.17|item.18|item.19 

당신은 개별 요소를 변경하여 서로 붙어 방법을 변화 할 수있다 paste()에 대한 축소 인수 당신은 단지 vetor으로 각 그룹을 갖고 싶어

또는, 당신은이를 사용할 수 있습니다

> df$rnames = as.character(df$rnames) 
> L = dlply(df, .(x), function(df) {df$rnames}) 
> L 
$`1` 
[1] "item.9" "item.11" "item.20" 

$`2` 
[1] "item.1" "item.2" "item.15" "item.16" 

$`3` 
[1] "item.7" "item.8" 

$`4` 
[1] "item.4" "item.5" "item.6" "item.12" "item.13" 

$`5` 
[1] "item.3" "item.10" "item.14" "item.17" "item.18" "item.19" 

attr(,"split_type") 
[1] "data.frame" 
attr(,"split_labels") 
    x 
1 1 
2 2 
3 3 
4 4 
5 5 

이 당신에게 벡터의 목록, 당신이 후했다 무엇을 제공합니다. 그리고 각 그룹은 결과 목록에서 색인을 생성 할 수 있습니다

> L[[1]] 
[1] "item.9" "item.11" "item.20" 
+0

나는이 질문을 편집했다. 내가 얻으려고하는 것은 각각의 집계 된 그룹이 벡터 /리스트로 반환된다는 것인데, '붙여 넣기'로 얻은 하나의 문자열과 대조됩니다. – Roy2012