2014-11-21 4 views
0

현재 각 요소가 문자 인 R 데이터 프레임이 있습니다. 그러나, 각 문자는 포인트 값에 대응한다 : B = 10, S = 1, C = 1, X = 0새 열을 만들기 위해 R 데이터 프레임의 문자 열 합계

예를 들어, 다음의 데이터 프레임 I 원하는

> df = data.frame(p1 = c("B", "B", "C", "C", "S", "S", "X"), p2 = c("X", "B", "B", "S", "C", "S", "X"), p3 = c("C", "B", "B", "X", "C", "S", "X")) 
> df 
    p1 p2 p3 
1 B X C 
2 B B B 
3 C B B 
4 C S X 
5 S C C 
6 S S S 
7 X X X 

고려 R : c1, c2, c3에 세 개의 새 열을 만듭니다.이 열은 기본적으로 p1, p2 및 p3 값의 "지연된"합계입니다 (각 문자의 숫자 값 사용).

p1 p2 p3 c1 c2 c3 
1 B X C 0 10 10 
2 B B B 0 10 20 
3 C B B 0 1 11 
4 C S X 0 1 2 
5 S C C 0 1 2 
6 S S S 0 1 2 
7 X X X 0 0 0 

예를 들어, C1은 항상 P1의 포인트 값이됩니다 C2 0으로 초기화되고, C3는 C2의 합 (P1)의 포인트 값이 될 것이다.

일반적으로 c_i = c_ {i-1} + p_ {i-1}.

R에서 이렇게 쉬운 방법이 있습니까? 비교적 초보자 인 R 사용자이기 때문에 미리 감사드립니다.

답변

2

이와 비슷한 기능이 작동합니다. matchFun은 일치하는 함수입니다.

matchFun <- function(x) c(10, 1, 1, 0)[x] 

within(df, { 
    c3 <- rowSums(sapply(list(p1, p2), matchFun)) 
    c2 <- matchFun(p1) 
    c1 <- 0L 
}) 
# p1 p2 p3 c1 c2 c3 
# 1 B X C 0 10 10 
# 2 B B B 0 10 20 
# 3 C B B 0 1 11 
# 4 C S X 0 1 2 
# 5 S C C 0 1 2 
# 6 S S S 0 1 2 
# 7 X X X 0 0 0 
+0

'matchFun'은 항상 factor이므로 'c (10, 1, 1, 0) [x]'는 충분하고 빠르다. –

+0

감사합니다. @MichaelLawrence. 그것은'p1'의 순서를 취하지 않습니까? –

+0

요소에는 정수로 인덱싱 된 사전 식 분류 된 수준이 있습니다. 유일한 변수는 모든 변수가 같은 레벨 세트를 갖고 있지 않다는 것입니다. –

관련 문제