2016-10-19 2 views
1

가중치가 부여 된 데이터가 포함 된 그룹별로 두 종류의 빈도 테이블을 계산하고자합니다.가중치 데이터가있는 그룹 별 빈도 테이블 R

다음과 같은 코드로 재현 데이터를 생성 할 수 있습니다

Data <- data.frame(
    country = sample(c("France", "USA", "UK"), 100, replace = TRUE), 
    migrant = sample(c("Native", "Foreign-born"), 100, replace = TRUE), 
    gender = sample (c("men", "women"), 100, replace = TRUE), 
    wgt = sample(100), 
    year = sample(2006:2007) 
    ) 

첫째, 나는 이주 상태의 주파수 테이블을 계산하려고 국가 및 연도 별 (기본 VS 외국 태생). 나는 패키지 questionrplyr를 사용하여 다음 코드를 썼다는 모든 년 동안이 코드를 적용하는 시간을 소요 있도록

db2006 <- subset (Data, year == 2006) 
db2007 <- subset (Data, year == 2007) 

result2006 <- as.data.frame(cprop(wtd.table(db2006$migrant, db2006$country, weights=db2006$wgt),total=FALSE)) 
result2007 <- as.data.frame(cprop(wtd.table(db2007$migrant, db2007$country, weights=db2007$wgt),total=FALSE)) 

result2006<-rename (result2006, c(Freq = "y2006")) 
result2007<-rename (result2007, c(Freq = "y2007")) 

result <- merge(result2006, result2007, by = c("Var1","Var2")) 

내 진짜 데이터베이스를, 나는 10 년 있습니다. 누구든지 빠른 방법을 알고 있습니까?

나는 또한 국가와 연도별로 이주 상태 중 여성과 남성의 비율을 계산하고자합니다. 나는 다음과 같은 것을 찾고있다.

Var1   Var2  Var3  y2006 y2007 
Foreign born France men  52  55 
Foreign born France women  48  45 
Native   France men  51  52 
Native   France women  49  48 
Foreign born UK  men  60  65 
Foreign born UK  women  40  35 
Native   UK  men  48  50 
Native   UK  women  52  50 

나는이 결과를 얻는 방법에 대해 누구나 알고 있는가?

답변

0

다음과 같이하면됩니다. 이미 작성한 코드로 기능을 만드십시오. lapply을 사용하여 데이터의 모든 기간 동안 해당 함수를 반복합니다. Reducemerge을 사용하여 결과 목록을 하나의 데이터 프레임으로 축소합니다. 이와 같이 :

# let's make your code into a function called 'tallyho' 
tallyho <- function(yr, data) { 

    require(dplyr) 
    require(questionr) 

    DF <- filter(data, year == yr) 

    result <- with(DF, as.data.frame(cprop(wtd.table(migrant, country, weights = wgt), total = FALSE))) 

    # rename the last column by year 
    names(result)[length(names(result))] <- sprintf("y%s", year) 

    return(result) 

} 

# now iterate that function over all years in your original data set, then 
# use Reduce and merge to collapse the resulting list into a data frame 
NewData <- lapply(unique(Data$year), function(x) tallyho(x, Data)) %>% 
    Reduce(function(...) merge(..., all=T), .) 
+0

TIL에 대해'Reduce()' – roman

+0

답변에 많은 @ulfelder 감사하지만 그것과 함께 약간의 문제가있었습니다. 코드를 실행하면 2006 년과 2007 년에 똑같은 결과를 얻었는데 이는 정확하지 않습니다 ... 어떻게 향상시킬 수 있는지 알고 있습니까? 성에 관한 정보를 어떻게 추가 할 수 있는지 알고 있습니까? –

+0

죄송합니다. 방금 게시 한 수정 된 버전을 사용해보십시오. 나는 함수 입력에 컬럼과 같은 이름을 부여함으로써'dplyr'를 혼란스럽게 생각한다고 생각한다. 불행히도'wtd.table'은 양방향 크로스 탭을 허용하는 것으로 나타 났으므로이 접근법에 성별을 추가 할 수 있다고 생각하지 않습니다. 그리고 나는 그러한 가중치가 대체 솔루션을 제안하기 위해 무엇을하는지 충분히 알지 못합니다. – ulfelder