假设我有一个数据框,其中有几行,如下所示:
User Lab Score
A 1 5
A 2 6
A 4 7
B 1 3
B 3 4
C 2 5然后,对于实验1,我想要将分数除以5,对于实验2,我想要将分数除以8,对于实验3,我想要将分数除以7,对于实验4,我想要将分数除以9。我该如何开始呢?
发布于 2013-07-08 23:48:06
对于这样的数据转换任务,可以使用ifelse,它是一种基于条件从不同结果中进行选择的矢量化形式。
df$Score <- with(df, ifelse(Lab == 1, Score/5,
ifelse(Lab == 2, Score/8,
ifelse(Lab == 3, Score/7, Score/9))))(假设您只有4个实验室。)
发布于 2013-07-09 00:03:28
这里是一个使用merge的干净和通用的解决方案。
dat1 <- data.frame(Lab=c(1,2,3,4),
coef = c(1/5,1/8,1/7,1/9))
dt.m <- merge(dat,dat1,all.x=TRUE)
dt.m$coef[is.na(dt.m $coef)] <- 1 ## default value
dtt <- transform(dt.m,newScore=Score*coef)
Lab User Score coef newScore
1 1 A 5 0.2000000 1.0000000
2 1 B 3 0.2000000 0.6000000
3 2 A 6 0.1250000 0.7500000
4 2 C 5 0.1250000 0.6250000
5 3 B 4 0.1428571 0.5714286
6 4 A 7 0.1111111 0.7777778如果您希望获得与原始数据相同的顺序和结构,请编辑:
dtt[order(dtt$User),c('User','Lab','Score','newScore')]
User Lab Score newScore
1 A 1 5 1.0000000
3 A 2 6 0.7500000
6 A 4 7 0.7777778
2 B 1 3 0.6000000
5 B 3 4 0.5714286
4 C 2 5 0.6250000发布于 2013-07-08 23:53:14
factor你的"Lab“值,指定除数作为labels,然后像往常一样除法(ifelse)。这可能非常不合常理,但也比很多除法更容易读懂。假设data.frame名为"mydf":
within(mydf, {
temp <- as.numeric(as.character(factor(Lab, levels=c(1, 2, 3, 4),
labels=c(5, 8, 7, 9))))
Score <- Score/temp
rm(temp)
})
# User Lab Score
# 1 A 1 1.0000000
# 2 A 2 0.7500000
# 3 A 4 0.7777778
# 4 B 1 0.6000000
# 5 B 3 0.5714286
# 6 C 2 0.6250000https://stackoverflow.com/questions/17530742
复制相似问题