2014-11-30 4 views
2

저는 R을 처음 접했고 열에 대한 기능 수행에 대해 질문이 있습니다.열의 그룹에서 기능 수행 R

data <- read.table(text ="group; val 
       a; 4 
       a; 24 
       a; 12 
       b; 1 
       a; 2 
       c; 4 
       c; 5 
       b; 6 ", sep=";", header=T,stringsAsFactors = FALSE) 

어떻게 데이터를 다음과 같이 추가 할 수 있습니까?

data$col1 <- 0 
data$col2 <- 1 

내가 지금하고 싶은 것은 새로운 열의에 각 그룹 값에 대해 +2를 추가하고 다음과 같은 패턴에 도달하는 것입니다 :

나는이 같은 일을 오전 두 개의 새로운 열을 만들 싶습니다 :

group val col1 col2 
    a  4  0 1 
    a 24  0 1 
    a 12  0 1 
    b  1  2 3 
    a  2  0 1 
    c  4  4 5 
    c  5  4 5 
    b  6  2 3 

어떻게하면됩니까? 나는 나의 모범을 더 많거나 적게 만들었 으면 좋겠다.

답변

3

이 시도 : 인덱스를 생성

누적 추가, 그룹

indx <- c(0, 2 * seq_len(length(unique(data[, 1])) - 1)) 

분할 그룹이 데이터 세트의 수에 따라 +2를 추가 (누적) +2 다시 unsplitting 너무 모든 것이 다시 온다 장소

data[, 3:4] <- unsplit(Map(`+`, split(data[, 3:4], data[, 1]), indx), data[, 1]) 
data 
# group val col1 col2 
# 1  a 4 0 1 
# 2  a 24 0 1 
# 3  a 12 0 1 
# 4  b 1 2 3 
# 5  a 2 0 1 
# 6  c 4 4 5 
# 7  c 5 4 5 
# 8  b 6 2 3 
+1

완벽한 사용이 정확히 맞아! – nebuloso

1

또는 당신은 할 수

within(data, {col1 <- 2*(as.numeric(factor(group))-1) 
        col2 <- col1+1})[,c(1:2,4:3)] 
# group val col1 col2 
#1  a 4 0 1 
#2  a 24 0 1 
#3  a 12 0 1 
#4  b 1 2 3 
#5  a 2 0 1 
#6  c 4 4 5 
#7  c 5 4 5 
#8  b 6 2 3 

data.table

library(data.table) 
setDT(data)[,c('col1', 'col2'):= {list(indx=2*(match(group, 
            unique(group))-1), indx+1)}] 

data 
# group val col1 col2 
#1:  a 4 0 1 
#2:  a 24 0 1 
#3:  a 12 0 1 
#4:  b 1 2 3 
#5:  a 2 0 1 
#6:  c 4 4 5 
#7:  c 5 4 5 
#8:  b 6 2 3