【问题标题】:Logical Testing in R - solution to group dataR中的逻辑测试 - 分组数据的解决方案
【发布时间】:2013-01-08 09:26:37
【问题描述】:

与我的朋友交谈后,我不确定我执行简单测试操作的解决方案是否非常适合在 R 中编程的方式。我对 r 很陌生,所以我可以使用关于如何正确学习而不是产生大量代码的一些反馈。

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

    #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 的设计目的不是为了在数据框中做这么多工作(在我的例子中,我应用了一个新列),而是直接处理新对象。所以他建议像将组创建为对象之类的东西 第 1 组

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

【问题讨论】:

标签: r grouping


【解决方案1】:

您可以为此使用cut(),然后调整您的因子水平:

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))

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

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)

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

【讨论】:

  • :D 我知道有更简单的方法。谢谢。但更一般地说:使用很多“ifelses”和循环是否很好?我的朋友提到在R中使用大量的contitioning和loops不是很好。使用对象而不是新列是否更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多