在R中的列中执行组上的功能

时间:2014-11-30 00:36:17

标签: r function grouping

我是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

我怎么能这样做?我希望我的例子或多或少都清楚。

2 个答案:

答案 0 :(得分:3)

试试这个:

创建索引以根据组数累积添加+2

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

按组拆分数据集,添加(累计)+2并取消拆分,以便所有内容都恢复原状

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 :(得分: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