我想在数据框中添加一列,该列将编码因子的特定级别。例如:
subject  rate
1          12
1          10 
1          13
4          4
4          6
4          12
2          9
2          2
2          5
6          17
6          10
6          1在上面的数据框中,我希望添加第三列,称为“治疗”,其中受试者被分配到两个级别"a“或"b”中的一个。例如,下面
subject  rate  treatment
1          12      a
1          10      a
1          13      a
4          4       b
4          6       b
4          12      b
2          9       b
2          2       b
2          5       b 
6          17      a
6          10      a
6          1       a  提前感谢您的帮助。
发布于 2011-06-13 21:38:49
下面是使用plyr包的另一种方法:
library(plyr)
#Make some fake data
set.seed(1)
dat <- data.frame(subject = rep(c(1,4,2,6), each = 3), rate = sample(1:20, 12, TRUE))
set.seed(1)
#Assign treatment based on the subject ID. This does not ensure that you will get
#at least one subject in each treatment group.
ddply(dat, "subject", transform, treatment = sample(letters[1:2], TRUE))评论编辑-处理您的
考虑到您想要指定哪个对象被分配到哪个治疗,Gavin对merge的建议恰到好处。我首先创建一个新的data.frame,为每个唯一的主题包含一条记录,分配它们的处理方式,然后将它们合并在一起:
treatments <- data.frame(subject = unique(dat$subject), treats = c("a", "b", "b", "a"))
merge(dat, treatments)请注意,unique(dat$subject)的顺序是1、4、2、6,它对应于原始data.frame中的值的顺序。如果您的实际问题包含四个以上的主题,您可能想要考虑一种更自动化的方法来分配处理组。我过去使用的一种方法是为每个受访者分配一个随机数,然后根据该随机数的给定阈值分配组。它基本上与上面的方法相同,但可以确保您在每个组中获得相同的数字。例如:
dat <- ddply(dat, "subject", transform, treatment = runif(1))
dat <- within(dat, treatment <- ifelse(treatment < quantile(treatment, 0.5),"a", "b"))发布于 2011-06-13 21:33:19
如果您想随机分配处理,可以这样做:
## subject IDs
subj <- with(dat, unique(subject))
## how many treatment levels?
ntreat <- 2
## sample an identifier for the treaments
set.seed(47)
treats <- sample(letters[seq_len(ntreat)], length(subj), replace = TRUE)
## stick this into a subject/treatment data frame
Treat <- data.frame(cbind(subject = subj, treatment = treats))这提供了:
R> Treat
  subject treatment
1       1         b
2       4         a
3       2         b
4       6         b编辑:
如果已经预先分配了处理,那么只需手动创建Treat数据框即可;
Treat <- data.frame(subject = c(1,4,2,6), treatment = c("a","b","b","a"))如果你有很多这样的事情要做,你可以使用像seq()和rep()这样的函数,再加上内置的letters常量来加速“数据输入”。
结束编辑
现在,我们可以使用此数据框与原始数据合并,使用merge()为相应的subject插入treatment
R> merge(dat, Treat)
   subject rate treatment
1        1   12         b
2        1   10         b
3        1   13         b
4        2    9         b
5        2    2         b
6        2    5         b
7        4    4         a
8        4    6         a
9        4   12         a
10       6   17         b
11       6   10         b
12       6    1         b发布于 2011-06-14 02:50:01
我假设你有一些如何转换这些数据的关键,比如1,6=>a,4,2=>b,然后ifelse和%in%的组合应该可以完成这项工作:
df$treatment<-factor(ifelse(df$subject%in%c('1','6'),'a','b'))更一般的选择是复制此因子并更改其级别,但详细信息取决于您的字典的存储方式。简单的例子:
x<-df$subject; levels(x)<-c('a','b','b','a')
x->df$treatment(在这两个示例中,我都假设主体是一个因素)
https://stackoverflow.com/questions/6331026
复制相似问题