2014-11-03 2 views
2

그래서 고객 설문 조사에서 주파수를 실행하려고합니다. 설문 조사에는 108 개의 변수가 있었으며 응답은 1-5로 코딩되었고, 9는 NA가되었습니다. 변수 중 일부는 텍스트 기반입니다. 원시 데이터는 다음과 같습니다 전체 DF에서 prop.table 실행

Q1 Q2 Q3 Q4 
1 3 2 Mazda 
2 3 4 Ford 
3 5 2 Toyota 
9 3 2 Hyundai 

가 이상적으로 나는 많은 사람들이 108 개 각 변수 형식으로 각 질문에 응답하는 방법을 알고 싶어요. 예를 들어, 나의 새로운 데이터 프레임의 첫 번째 열은 다음과 같습니다

Q1 
1 25% 
2 25% 
3 25% 
4 0% 
5 0% 
9 25% 

나는 그것은 목록으로 그것을 밖으로 뱉어

Frequencies = apply(df, 2, table) 

를 사용하여 시도했습니다. 그럼이 목록을 실행하고 싶습니다.

prop.table(Frequencies, 2) 

열 비율을 얻으려면. 그러나 "margin.table (x, margin) 오류 : 'x'는 배열이 아닙니다."라는 오류 메시지가 나타납니다.

주파수를 데이터 프레임으로 변환하면서 며칠 동안 놀았지만 운이 없었습니다. 어떤 아이디어?

감사합니다.

추신 : 나는 4 일 동안이 작업을 해왔고 온라인에서 해결책을 찾지 못했습니다. 미안해, 근본이야. 나는 이것에 아주 새롭다.

+1

작은 재현 가능한 예를 게시하십시오. –

+0

작은 데이터 샘플로 업데이트했습니다. 그게 당신이 요구 한 것입니까? @Glen_b –

+0

각 질문의 평가 점수는 1 : 9입니까? – gung

답변

2

시도 :

> ddf 
    Q1 Q2 Q3  Q4 
1 1 3 2 Mazda 
2 2 3 4 Ford 
3 3 5 2 Toyota 
4 9 3 2 Hyundai 
> 
> sapply(apply(ddf, 2, table), function(x) x/sum(x)) 
$Q1 

    1 2 3 9 
0.25 0.25 0.25 0.25 

$Q2 

    3 5 
0.75 0.25 

$Q3 

    2 4 
0.75 0.25 

$Q4 

    Ford Hyundai Mazda Toyota 
    0.25 0.25 0.25 0.25 

또는이 @DavidArenburg 댓글에 제안했다 같이

lapply(ddf, function(x) prop.table(table(x))) 
+0

이중 루프를 실행하는 이유는 무엇입니까? 'lapply (df, function (x) prop.table (table (x)))'의 잘못된 점은 무엇입니까? –

+0

@DavidArenburg 네 말이 맞아. OP가 이미 apply (ddf, 2, table)를 사용하고 있었기 때문에, 나는 그의 코드를 완성하려고 시도했다. – rnso

1

먼저 당신이 관심있는 수준 요소로 열을 포맷해야합니다. 그런 다음 ?lapply을 사용하여 목록에 함수를 적용 할 수 있습니다 (데이터 프레임은 목록 유형 임). 원하는 작업을 수행하려면 lapply() 호출 내에서 사용자 지정 함수를 작성해야합니다. lapply()의 출력은 또 다른 목록이므로 요인 수준을 설정할 때 데이터 프레임으로 되돌리려면 as.data.frame() 내에 중첩하여 데이터 프레임으로 되돌릴 수 있습니다. 마지막 lapply() 호출의 경우 목록으로 유지하는 것이 가장 좋습니다. 그렇지 않으면 R은 recycle보다 짧은 출력으로 길어지는 출력과 길이를 같게하기 때문입니다.

df <- read.table(text="Q1 Q2 Q3 Q4 
1 3 2 Mazda 
2 3 4 Ford 
3 5 2 Toyota 
9 3 2 Hyundai", header=TRUE) 
dfQs <- as.data.frame(lapply(df[,1:3], function(x){ factor(x, levels=c(1:5,9)) })) 
dfQs$Q4 <- as.factor(df$Q4) 
dfQs 
# Q1 Q2 Q3  Q4 
# 1 1 3 2 Mazda 
# 2 2 3 4 Ford 
# 3 3 5 2 Toyota 
# 4 9 3 2 Hyundai 
proportions <- lapply(dfQs, function(x){ prop.table(table(x)) }) 
proportions 
# $Q1 
# 1 2 3 4 5 6 7 8 9 
# 0.25 0.25 0.25 0.00 0.00 0.00 0.00 0.00 0.25 
# $Q2 
# 1 2 3 4 5 6 7 8 9 
# 0.00 0.00 0.75 0.00 0.25 0.00 0.00 0.00 0.00 
# $Q3 
# 1 2 3 4 5 6 7 8 9 
# 0.00 0.75 0.00 0.25 0.00 0.00 0.00 0.00 0.00 
# $Q4 
# Ford Hyundai Mazda Toyota 
# 0.25 0.25 0.25 0.25 
+0

(+1) 이것은 거의 정답입니다. 단, 그는 9 레벨 모두를 필요로하지 않고 단 1 : 5와 9 (NA는 없음)입니다. 두 번째 문제는 이것이 일반적인 해결책이 아니며 그가 모든 범주 형 변수를 수동으로 실행할 것이라고 생각하지 않는다는 것입니다. 결론적으로, 일반적인 해결책은 'lapply (df, function (x) if (is.numeric (x)) prop.table (table (factor) x, levels = c (1 : 5, 9))) 그렇지 않으면 prop.table (table (x)))'. 그리고 여러분은'as.data.frame'을 필요로하지 않습니다. 각 열의 출력 길이가 항상 다르기 때문에 목록으로 남겨 두십시오. –

+0

@DavidArenburg, 레벨에 대한 팁 덕분에, 나는 그것을 놓쳤습니다. . 나는'lapply'와 함께'if'를 중첩하는 것보다 두 개의 명백한'lapply'를 선호합니다. 더 많은 라인을 필요로하지만 IMO가 펼쳐지는 것이 더 쉽습니다. – gung

관련 문제