2012-11-23 2 views
0

나는 다른 응답자열거하고 어떻게 계산

Data = 
ID Q1 Q2 Q3 
1 A1 B2 C3 
2 A2 B1 C2 
3 A1 B2 C3 
... 

과에 대한 설문 조사의 응답으로 생각 될 수있는이 같은 데이터 프레임을,이 경우에 나는 또한 다음과 같은 점수 테이블이 있습니다

Q1 <- (c("A1", 10, "A2", 20, ...)) 
Q2 <- (c("B1", 10, "B2", 20, ...)) 
Q3 <- (c("C1", 10, "C2", 20, ...)) 

Q2에서 "B2"를 선택하면 20 점을 더받습니다. Q3에서 "C1"을 선택하면 10 점이됩니다. 즉 Q1에서 "A1"을 선택하면 10 점이됩니다. 내가 얻은 총 점수는 다음과 같습니다. 10 (A1) + 20 (B2) + 10 (C1) = 40

이제 데이터의 모든 행에 대해 점수 표에 따라 각 열의 점수를 합하여 총 점수를 계산해야합니다.

간단한 코드를 어떻게 사용할 수 있습니까? 당분간 나는 Xx2 행렬에 스코어 테이블을 만들고, 중첩 된 if와 for-loop를 많이 사용한다고 생각할 수 있습니다.

답변

1
df <- read.table(text="ID Q1 Q2 Q3 
1 A1 B2 C3 
2 A2 B1 C2 
3 A1 B2 C3",header=TRUE, stringsAsFactors=FALSE) 

scores <- list(
Q1 = c("A1", 10, "A2", 20, "A3", 30), 
Q2 =c("B1", 30, "B2", 10, "B3", 20), 
Q3 =c("C1", 10, "C2", 30, "C3", 20) 
) 

#lookup table 
scores <- do.call("cbind",scores) 

#match 
m <- apply(df[,-1],2,match,table=scores) 

#look up 
points <- matrix(as.numeric(scores[m+1]),ncol=ncol(df)-1) 

#sum for each ID 
result <- cbind(df,Score=rowSums(points)) 

    ID Q1 Q2 Q3 Score 
1 1 A1 B2 C3 40 
2 2 A2 B1 C2 80 
3 3 A1 B2 C3 40 
1

데이터 :

Data <- read.table(text = "ID Q1 Q2 Q3 
1 A1 B2 C3 
2 A2 B1 C2 
3 A1 B2 C3", header = TRUE) 

Q1 <- c("A1", 10, "A2", 20) 
Q2 <- c("B1", 10, "B2", 20) 
Q3 <- c("C1", 10, "C2", 20) 

가 먼저 Q 객체들의리스트가 생성된다

Qlist <- list(Q1 = Q1, Q2 = Q2, Q3 = Q3) 

이제 sapply가 사용될 수있다 :

cbind(Data, 
     QSum = rowSums(sapply(names(Qlist), 
          function(q) 
           as.numeric(Qlist[[q]][match(Data[[q]], 
                  Qlist[[q]]) + 1])), 
        na.rm = TRUE)) 

출력을 :

ID Q1 Q2 Q3 QSum 
1 1 A1 B2 C3 30 
2 2 A2 B1 C2 50 
3 3 A1 B2 C3 30 
1

롤랜드가 선택한대로 "점수"를 사용하겠습니다. 점수 표를 2x2 행렬로 변경할 수 있다고 언급 했으므로 점수가 다른 데이터 구조를 갖는 다른 2 점과는 다른 솔루션을 제공합니다.

것은 내가 당신에게 코드를 제공하기 전에 내가 나에게 논리를 설명 할 수 있도록 허용 : 나는 각 행에 대해 행

  • 에 의해 안양 행을 처리 할

    1. 을, 나는 질문 당 선택한 답에 대한 점수를 사용하고자하는
    2. 나는

    2를 기반으로, 나는 인덱스 질문 번호 & 입력 한 답변에 따라 할 수있는 연관 배열에 대한 필요성을 느끼게을 요약하고 싶습니다. 따라서 점수에 대한 다음과 같은 표현을 만듭니다.

    > scores <- list(
    +     Q1 = list(A1=10,A2=20,A3=30), 
    +     Q2 = list(B1=30,B2=10,B3=20), 
    +     Q3 = list(C1=10,C2=30,C3=20) 
    +    ) 
    

    기본적으로 점수는 이제 목록의 목록입니다. 이렇게함으로써, 나는 다음과 같은 작업을 수행 할 수 있습니다

    > scores[["Q1"]][["A1"]] 
    [1] 10 
    

    지금 내가 할 필요는 위의 "Q1"& "A1을"의 파라미터를 할 수있는 방법을 알아낼 수 있습니다.제가, 신경 것은 ID 열없이 각각의 행

    > df 
        ID Q1 Q2 Q3 
    1 1 A1 B2 C3 
    2 2 A2 B1 C2 
    3 3 A1 B2 C3 
    

    다음과 같이 "DF"

    데이터 프레임이다. 그래서, 난 그냥 추출 : 지금

    > df[1,-1] 
        Q1 Q2 Q3 
    1 A1 B2 C3 
    

    당신은 내가 점수 & 2 인덱스에 대한 행의 값에 첫 번째 인덱스 열 이름을 선택해야 볼 수 있습니다. 따라서 점수 [[column-M]] [[row-NvalueForColumn-M]]을 얻을 수 있다면 그들을 요약 할 수 있습니다.

    열 이름은 쉽게 얻어진됩니다

    > columnNames <- colnames(df[1,-1]) 
    > columnNames 
    [1] "Q1" "Q2" "Q3" 
    

    그래서 필요한 로직을 수행하는 코드의 최종 조각이있다 :

    > columnNames <- colnames(df[1,-1]) 
    > score <- c(0,0,0) 
    > for (i in 1:length(df[1,-1])) 
    + { 
    +  for (j in 1:length(columnNames)) 
    +  { 
    +   score[i] <- score[i] + scores[[columnNames[j]]][[df[i,-1][[columnNames[j]]]]] 
    +  } 
    + } 
    > final <- cbind(df,score) 
    > final 
        ID Q1 Q2 Q3 score 
    1 1 A1 B2 C3 40 
    2 2 A2 B1 C2 80 
    3 3 A1 B2 C3 40 
    > 
    

    내가 위의 코드에 의해 감소 ​​될 수 있다고 생각 적어도 5 행 (rowsums 등 사용). 나는 Sven과 같은 숙련 된 사람들이 위의 코드 조각을 멋진 라인의 쌍으로 향상시킬 수 있다고 확신한다. 입력을 고맙게 생각합니다.

  • 관련 문제