首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的逻辑测试-分组数据的解决方案

R中的逻辑测试-分组数据的解决方案
EN

Stack Overflow用户
提问于 2013-01-08 17:26:38
回答 1查看 526关注 0票数 0

在和我的一个朋友谈过之后,我不再确定我的解决方案执行一个简单的测试操作是不是很好,因为我对R编程很陌生,所以我可以使用一些反馈来正确地学习它,而不是生成大量的代码。

我的目标只是根据不同的范围对列中的值进行分组。所以我做了下面的事情:

代码语言:javascript
复制
    #create a test df
    a<-factor(c("a","b","c","d","e","f","g"))
    b<-c(1,2,NA,4,5,6,7)
    c<-factor(c("a","a","a","d","e","f","a"))
    d<-c(1,7,1,7,2,5,4)
    df.abcd<-data.frame(a,b,c,d)
    df.abcd

    # apply groups in new column based on values in d 
    # groups are 0-2, 3-5, 6-7
    df.abcd$groups<-
      ifelse(df.abcd$d>-1&df.abcd$d<=2,"0-2",
             ifelse(df.abcd$d>2&df.abcd$d<=5,"3-5",
                    ifelse(df.abcd$d>5&df.abcd$d<=7,"6-7","outside the defined Ranges" 
                    )

             )
      )

所以这个解决方案对我来说工作得很好,但它需要大量的代码和很多ifelse的东西。也许应该有一个更优雅的解决方案。

我的朋友告诉我,R不是设计用来在dataframe中做这么多工作的(在我的例子中,我应用了一个新的列),而是直接使用新对象。因此,他建议将组创建为像Group1<- etc这样的对象。由于我自己学习R,并且没有教授教我以正确的方式(通过做来学习),我不想避免违反语言的逻辑(如果有这样的事情)。

因此,任何帮助和解释都将不胜感激。最好的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-08 17:31:56

为此,您可以使用cut(),然后调整因子级别:

代码语言:javascript
复制
df.abcd$groups <- cut(df.abcd$d, c(0,2,5,7))
levels(df.abcd$groups) <- c("0-2", "3-5", "6-7", "Outside the defined range")
df.abcd$groups[is.na(df.abcd$groups)] <- max(levels(df.abcd$groups))

或者你可以使用索引向量,例如,如果你不想拆分一个连续的范围:

代码语言:javascript
复制
df.abcd$groups[df.abcd$d>-1 & df.abcd$d<=2] <- "0-2"
df.abcd$groups[df.abcd$d>2 & df.abcd$d<=5] <- "3-5"
df.abcd$groups[df.abcd$d>5 & df.abcd$d<=7] <- "6-7"
df.abcd$groups[is.na(df.abcd$groups)] <- "Outside the defined range"
df.abcd$groups <- as.factor(df.abcd$groups)

一般来说,循环和/或堆叠大量的In不是一个好主意。尽可能使用索引向量和内置R函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14211821

复制
相关文章

相似问题

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