在和我的一个朋友谈过之后,我不再确定我的解决方案执行一个简单的测试操作是不是很好,因为我对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不是设计用来在dataframe中做这么多工作的(在我的例子中,我应用了一个新的列),而是直接使用新对象。因此,他建议将组创建为像Group1<- etc这样的对象。由于我自己学习R,并且没有教授教我以正确的方式(通过做来学习),我不想避免违反语言的逻辑(如果有这样的事情)。
因此,任何帮助和解释都将不胜感激。最好的
发布于 2013-01-08 17:31:56
为此,您可以使用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)一般来说,循环和/或堆叠大量的In不是一个好主意。尽可能使用索引向量和内置R函数。
https://stackoverflow.com/questions/14211821
复制相似问题