2014-10-01 3 views
1

r을 적용하는 방법과 r을 사용하는 방법을 천천히 배우고 있지만 전체적으로는 실패합니다.R : for 루프에서리스트 채우기

>df 
    id timestamp user_id app_version  
1 96 2013-03-05 12  1.05 
2 99 2013-03-05 32  1.0.5 
3 02 2013-03-05 21  1.05 
4 14 2013-03-05 21  1.0.5 
5 16 2013-03-05 12  1.0.5 
6 32 2013-03-06 32  1.0.3 
7 33 2013-03-06 33  1.0.3 
8 37 2013-03-06 12  1.0.3 
9 39 2013-03-06 21  1.0.3 
10 40 2013-03-06 12  1.0.5 

그리고 벡터, 응용 프로그램 :

나는 (수천 user_ids 내 데이터 세트는 몇 년 동안 많은 날짜로 구성되어 현실에서,) 4 열 데이터 프레임, DF을 가지고

응용 프로그램 < -c는 ("1.0.3", "1.0.5", "2.05")

내 최종 목표는 사용자가 로그인 할 때 하루에 평균 횟수를 계산하는 것이다 (즉,사용자가 동일한 타임 스탬프로 가지고있는 엔트리 수의 평균)를 버전 번호 (예. 앱 버전 1.05 사용자의 경우 2013-03-05에 하루 평균 3 회의 로그인이 발생합니다. df[which(df$app_version="1.05"),]을 통해 직접이 작업을 수행 할 수 있습니다. 하지만 내 애플 리케이션 벡터를 통해 루프를하고 각 데이터 프레임은 행과 평균으로 날짜를 포함하는 각 애플 리케이션 버전에 대한 하나의 데이터 프레임, 결국 데이터 프레임의 목록을 가지고 싶습니다. 열로 로그인 한 수). 아래의 코드는 내 접근 방식이지만 두 개의 숫자가 아닌 두 개의 데이터 프레임 목록이므로 최종 목록이 정확하지 않습니다. 모든 도움이 하느님의 선물이 될 것입니다. 고마워요!

require(reshape2)  
require(dplyr)  
require(lubridate) 
df$timestamp <- as.Date(df$timestamp) # Converting to date 


# Step 1 ------------------------------------------------------------------ 
# Parsing data into different dataframes for each app version 
flist<-vector(mode="list",length=length(app)) 
fdts<-vector(mode="list",length=length(app)) 
for (i in 1:length(app)){ 
    appdat<-df[which(df$app_version==app[i]),] 

# Step 2 ------------------------------------------------------------------ 
# Creating table of timestamps as columns, with user_ids making up row 
tmp.ndat<-dcast(appdat,id~timestamp,value.var="user_id",drop=TRUE) 

# Step 3 ------------------------------------------------------------------ 
# Createing contingency tables of each day 
ctable.day<-apply(tmp.ndat[,-1],2,table) 

# Step 4 ------------------------------------------------------------------ 
# Calculating the avg and stdev for each user for each day 
dts<-as.Date(names(ctable.day)) 
avg.day<-lapply(ctable.day,mean) 
sd.day<-lapply(ctable.day,sd) 

# Step 5 ------------------------------------------------------------------ 
# Combine all averages and stdevs, with timestamp as rows and app version as columns 
tmp<-cbind(avg.day,sd.day) 
tmp.dts<-as.Date(names(ctable.day)) 

flist[i]<-tmp 
fdts[i]<-tmp.dts 
} 
return(flist) 
+1

당신이 뭘 하려는지 명확하지 않다 없기 때문에 상당히 재미있다 . 또한 데이터에 존재하지 않는 2013-06-05 날짜에 대해서도 이야기합니다. – agstudy

답변

0

코드를 살펴보면 다른 데이터 프레임에있는 각 app_version을 사용하여 매일 사용자 당 로그인의 평균 횟수를 원하는 것처럼 보입니다. 따라서 특정 날짜에 3 명의 사용자가 앱에 로그인하고 1,5 및 8 번 로그인 한 경우 평균은 (1 + 5 + 8)/3이됩니다. 이것이 틀렸다면 알려주십시오. 나는 대답을 삭제할 것입니다.

df$counts <- 1 
# tmp$count contains number of logins by each user for each app for each day 
tmp <- aggregate(counts~user_id+timestamp+app_version,df,sum) 
get.stats <- function(x) c(mean=mean(x), sd=sd(x)) 
result <- lapply(split(tmp,tmp$app_version), 
      function(dat)aggregate(counts~timestamp+app_version,dat,get.stats)) 
result <- lapply(result,function(r)with(r,data.frame(timestamp,app_version,counts))) 
result 
# $`1.0.3` 
# timestamp app_version mean sd 
# 1 2013-03-06  1.0.3 1 0 
# 
# $`1.0.5` 
# timestamp app_version mean sd 
# 1 2013-03-05  1.0.5 1 0 
# 2 2013-03-06  1.0.5 1 NA 
# 
# $`1.05` 
# timestamp app_version mean sd 
# 1 2013-03-05  1.05 1 0 

이 코드는 더미 열, 다음 단계에 필요한 df$counts를 만듭니다

다음은이 작업을 수행하는 하나의 방법입니다. 그런 다음 user_id, timestampapp_version을 집계하여 각 사용자별로 각 앱의 로그인 수를 계산합니다. 그런 다음 lapply(split(df,df$app_version), FUN)을 사용하여 dfapp_version으로 분할하고 각 하위 집합에 함수를 적용합니다. 함수는 평균 및 sd를 계산하기 위해 counts을 타임 스탬프 (그리고 app_version하지만 주어진 하위 집합에 하나만 있습니다.)로 집계합니다. 샘플 데이터

결과는 한 번 특정 일에 특정 응용 프로그램에 대한보다 더 많은에는 사용자가 로그, 그래서 수단이 모든 = 1

+0

솔루션을 제공해 주셔서 감사합니다. 'aggregate()'의 사용은 여기에서 핵심이었고, 다른 것들보다 훨씬 빠르게 작동합니다. – Archimeow

0

당신이하려는 일에 대한 설명이 상당히 모호합니다. 예를 들어 각 날짜의 평균을 원하지만 그 평균은 무엇입니까? 평균과 반대되는 수를 의미합니까? 내가 이해 한 바에 따르면, 이것은 apply 패밀리의 함수를 사용하여 split-apply-combine 메소드에 대한 이상적인 사용 사례처럼 보입니다. 구체적으로는 tapply입니다. tapply을 실행하고 버전 열 및 날짜 열에 따라 부분 집합 된 데이터 프레임에서이 기능을 적용해야합니다. 내가 뭘 할 것인가는 먼저 버전에 따라 모든 것을 나눠서 데이터 프레임 목록을 되 찾는다. 그런 다음 해당 목록의 모든 항목에 대해 tapply을 수행하십시오.