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

问题描述:

在与我的一位朋友交谈之后,我不再确定如果我的解决方案执行简单的测试操作对于在R中编程的方式来说非常好。 m对于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,没有教授教我如何正确做事(边干边学),我不想避免反对语言的逻辑(如果有这样的事情)。

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

+1

也许看到http://*.com/q/10431403/,以及'?cut'和'?findInterval' – BenBarnes

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

+0

:D我知道有一个更简单的方法。谢谢。但更一般的说:使用大量“ifelses”和循环是好事吗? friend朋友提到,在R中使用大量的连接和循环并不是很好,是否更好地使用对象而不是新的列? – Joschi