首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R编程:根据不同的列对每一行执行具有切换功能的函数

R编程:根据不同的列对每一行执行具有切换功能的函数
EN

Stack Overflow用户
提问于 2013-05-22 22:29:04
回答 2查看 221关注 0票数 3

在R编程中,我尝试执行以下操作:

代码语言:javascript
复制
    df
    A       B     Category
    0.9     0.85  A
    0.7     0.75  B
    0.8     0.90  B

    CSF <- function(df, type) {
    switch(type,
               "A" = qnorm(df$A, 0 , 1),
               "B" = qnorm(df$B, 0 , 1)
    )
    }

    df<-data.frame(df, value = CSF(df,df$category))

期望的结果:

代码语言:javascript
复制
    df
    A       B     Category     Value
    0.9     0.85  A            qnorm(0.9, 0, 1)*
    0.7     0.75  B            qnorm(0.75, 0, 1)*
    0.8     0.90  B            qnorm(0.9, 0, 1)*

*:实值

错误消息: EXPR必须是长度为1的向量

EN

回答 2

Stack Overflow用户

发布于 2013-05-22 22:45:24

您可以使用ifelse函数:

代码语言:javascript
复制
df$Value <- ifelse(df$Category=="A",qnorm(df$A,0,1),qnorm(df$B,0,1))
票数 3
EN

Stack Overflow用户

发布于 2016-01-07 02:38:35

对于更复杂的类别排列,我建议将其分解为多个语句。就像这样

代码语言:javascript
复制
df$CSF <- NA
df.split <- split(df, df$Category)
df.split$A$CSF <- qnorm(df.split$A$A, 0, 1)
df.split$B$CSF <- qnorm(df.split$B$B, 0, 1)
...

然后再把它们合并在一起

代码语言:javascript
复制
df <- unsplit(df.split, df$Category)

它没有“单一表达式”的优雅,但它也避免了大量的嵌套来完成任务。您可以使用within简化各个表达式

代码语言:javascript
复制
df.split$A <- within(df.split$A, CSF <- qnorm(A, 0 0))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16694463

复制
相关文章

相似问题

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