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,没有教授教我如何正确做事(边干边学),我不想避免反对语言的逻辑(如果有这样的事情)。
所以任何帮助和解释将不胜感激。 最佳
答
您可以使用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
也许看到http://stackoverflow.com/q/10431403/,以及'?cut'和'?findInterval' – BenBarnes