2012-05-23 9 views
1

나는 트위터 플랫 파일을 가지고 있으며 사용자별로 속성을 집계하고 싶습니다.여러 관찰을 결합하여 R

내가로 변환하고자하는

user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8 

:

user1, hashtag1, hashtag2, hashtag3, hashtag4 
user2, hashtag5, hashtag6, hashtag7, hashtag8 

는이 작업을 수행하는 우아한 방법이 있나요?

+0

"파일"입력 방법을 나타내는 '코드'형식이 추가되었습니다. –

+0

사용자 당 해시 태그 수가 다른 경우 어떻게됩니까? 아니면 사람마다 네 개의 해시 태그가 항상 존재합니까? 기둥 내에서의 명령은 중요합니까? – Chase

답변

3

사용자 당 해시 태그의 수가 항상 동일하지 않으면 결과를 목록에 집계합니다. 목록의 각 요소는 한 사용자의 해시 태그에 대한 가변 길이의 벡터 일 수 있습니다.

# Read in your example data 
df <- read.table(text="user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8", sep=",", header=FALSE, stringsAsFactors=FALSE) 


lapply(split(df[-1], df[1]), function(X) unname(unlist(X))) 
# $user1 
# [1] " hashtag1" " hashtag3" " hashtag2 " " hashtag4 " 
# 
# $user2 
# [1] " hashtag5" " hashtag7" " hashtag6 " " hashtag8" 
+0

나는이 접근법을 취할 것이다. 트위터 사용자가 모두 동일한 수의 해시 태그를 갖지는 않을 것입니다. 이 목록은 데이터 프레임이 아닌 OP 이후의 데이터 구조입니다. – jthetzel

+0

빠른 피드백에 감사드립니다. 사용자 당 태그 수가 다르다는 것이 맞습니다. 한 가지 질문 : lapply가 '목록'을 생성하고이를 데이터 프레임으로 변환하면 "인수의 행 수가 달라집니다"라는 오류가 발생합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 미안, 나는 초보자 야. –

+0

@MikeJensen - 데이터를 목록에 남겨 두는 것이 가장 좋습니다. data.frame은 실제로 각 열이 변수이고 각 행이 관측 값 또는 개체 인 표 형식의 데이터를 저장하도록 설계되었습니다. 귀하의 데이터는 실제로 그 패턴에 맞지 않습니다, 그리고 당신이보고하는 오류 메시지는 당신에게 그것을 말하려고하는 종류입니다! –

1

당신은 모양을 찾고 있습니다. reshape 명령 (통증이있는 ​​구문이지만 기본적으로 "사용자"를 ID 변수로 사용하여 "long"에서 "wide"로 이동하려는 경우) 또는 melt 다음에 reshape2 패키지가 있고 그 다음에 dcast을 입력하면 원하는 작업을 수행 할 수 있습니다. 이 해시 태그의 수가 다를 수 있습니다 보이기 때문에

또는, 당신은 plyr를 사용하여 할 수있는 :

> colnames(x) <- c("user","tag1","tag2") 
> 
> library(plyr) 
> extract.hashtags <- function(x) { 
+ x <- subset(x,select=c(-user)) 
+ mat <- as.matrix(x) 
+ dim(mat) <- c(1,length(mat)) 
+ as.data.frame(mat) 
+ } 
> ddply(x, .(user), extract.hashtags) 
    user  V1  V2  V3  V4 
1 user1 hashtag1 hashtag3 hashtag2 hashtag4 
2 user2 hashtag5 hashtag7 hashtag6 hashtag8 
1

한 가지 방법은 aggregate() 기능을 사용하는 것입니다. ?aggregate에서 :

부분 집합으로 데이터 분할, 각각 에 대한 요약 통계를 계산하고 (당신이 당신의 질문에이 작업을 수행해야 데이터를 읽을

우선 편리한 형태로 결과를 반환 하위 집합으로 데이터를 분할 aggregate()를 사용, 그리고

txt <- "user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8" 

x <- read.delim(file = textConnection(txt), header = F, sep = ",", 
     strip.white = T, stringsAsFactors = F) 

을 각각의 부분 집합 t 변환 :) How to make a great R reproducible example?를 : 재현 예를 제공하기 위해 미래에 참조 오 1 차원 배열 :

aggregate(x[-1], by = x[1], function(z) 
     { 
      dim(z) <- c(length(z)) # Change dimensions of z to 1-dimensional array 
      z 
     }) 
#  V1  V2.1  V2.2  V3.1  V3.2 
# 1 user1 hashtag1 hashtag3 hashtag2 hashtag4 
# 2 user2 hashtag5 hashtag7 hashtag6 hashtag8 

편집 모든 사용자가 아닌 것 같습니다 해시 태그 같은 수의,있는 경우이 방법에만 작동

. @Josh O'Brien의 답변이 더 나은 접근 방법입니다.

관련 문제