如何对组中的每个元素执行某些操作

时间:2015-11-23 00:59:23

标签: r

假设我有一个像这样的数据框

a b c
1 2 3
1 3 4
1 4 5
2 5 6
2 6 7
3 7 8
4 8 9

我想要的是以下内容:

a b c d
1 2 3 a
1 3 4 b
1 4 5 c
2 5 6 a
2 6 7 b
3 7 8 a
4 8 9 a

基本上,我想做一个循环,对于列a的每个组,我想创建一个新的列,按顺序循环从a到z的字母。第1组有三个元素,因此字母从'a'变为'c'。第3组和第4组只有1个元素,因此字母只被赋予“a”。

2 个答案:

答案 0 :(得分:5)

data.table选项是

library(data.table)
setDT(dd)[, d:= letters[seq_len(.N)], by = a]

答案 1 :(得分:4)

执行此操作的一种方法是使用 split-apply-combine 范例,如plyr(或dplyrdata.table或...... 创建数据:

dd <- data.frame(a=rep(1:4,c(3,2,1,1)),
                 b=2:8,c=3:9)

使用ddply按变量a拆分数据框,通过添加适当的变量转换每个部分,然后重新组合:

library("plyr")
ddply(dd,"a",
      transform,
        d=letters[1:length(b)])

dplyr

library("dplyr")
dd %>% group_by(a) %>%
   mutate(d=letters[1:n()])

或在基地R(感谢@thelatemail):

dd$d <- ave(rownames(dd), dd$a, 
     FUN=function(x) letters[seq_along(x)] )