2014-11-30 1 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

Попробуйте это:

Создание индекса для кумулятивно добавить +2 в зависимости от количества групп

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

Расщепление набора данных по группам, добавляя (совокупно) +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 
Смежные вопросы