0

在与我的一位朋友交谈后,我不确定我执行简单测试操作的解决方案是否非常适合在 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 的设计目的不是在数据帧中做这么多工作(在我的例子中,我应用了一个新列),而是直接处理新对象。所以他建议像将组创建为像 Group1<- 这样的对象。由于我自己学习 R,而且我没有教授教我以正确的方式去做(边做边学),我不想避免反对语言的逻辑(如果有这样的事情)。

所以任何帮助和解释将不胜感激。最好的

4

1 回答 1

4

您可以使用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 函数。

于 2013-01-08T09:31:56.163 回答