首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带数据框的R中的If语句

带数据框的R中的If语句
EN

Stack Overflow用户
提问于 2013-07-08 23:43:26
回答 3查看 15.5K关注 0票数 3

假设我有一个数据框,其中有几行,如下所示:

代码语言:javascript
复制
        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。我该如何开始呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-08 23:48:06

对于这样的数据转换任务,可以使用ifelse,它是一种基于条件从不同结果中进行选择的矢量化形式。

代码语言:javascript
复制
df$Score <- with(df, ifelse(Lab == 1, Score/5,
                     ifelse(Lab == 2, Score/8,
                     ifelse(Lab == 3, Score/7, Score/9))))

(假设您只有4个实验室。)

票数 11
EN

Stack Overflow用户

发布于 2013-07-09 00:03:28

这里是一个使用merge的干净和通用的解决方案。

代码语言:javascript
复制
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

如果您希望获得与原始数据相同的顺序和结构,请编辑:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-07-08 23:53:14

factor你的"Lab“值,指定除数作为labels,然后像往常一样除法(ifelse)。这可能非常不合常理,但也比很多除法更容易读懂。假设data.frame名为"mydf":

代码语言:javascript
复制
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.6250000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17530742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档