假设我有一个像这样的数据框
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”。
答案 0 :(得分:5)
data.table选项是
library(data.table)
setDT(dd)[, d:= letters[seq_len(.N)], by = a]
答案 1 :(得分:4)
执行此操作的一种方法是使用 split-apply-combine 范例,如plyr
(或dplyr
或data.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)] )