2012-08-14 82 views
0

对不起,如果这是一个菜鸟问题。 我需要关于如何遍历我的数据帧的帮助。这里是一个示例数据。重构data.frame列值

a <- c(10:29); 
b <- c(40:59); 
e <- rep(1,20); 
test <- data.frame(a,b,e) 

我需要操纵柱的 “e” 使用以下标准在列中的值的 “a”

用于

“一” < = 15, “E”= 1的所有值,

“一”> 15 & < 20, “E”= 2

“一”> 20 & < 25, “E”= 3

“一”> 25 & < 30, “E”= 4等看起来像这样

result <- cbind(a,b,rep(1:4, each=5)) 

我的实际数据帧是在100k的长。如果你能在这里排序我会很好。

+0

我觉得标题应该反映这里所做的。您正试图根据其他列的值添加一个记录列。 – 2012-08-14 12:04:04

+0

抱歉罗马关于不是最优秀的标题,你是对的 - 关于重新编码基于其他人的专栏。但你们已经把我排除了:) – Biju 2012-08-14 13:28:46

+0

只是想帮助下一个对这个问题感兴趣的人。通过给它一个内容丰富的标题,你的答案会有更好的机会帮助某人。随意编辑标题以反映你的Q. :) – 2012-08-15 18:44:25

回答

11
data.frame(a, b, e=(1:4)[cut(a, c(-Inf, 15, 20, 25, 30))]) 

更新:

Greg's评论提供,而不需要通过子集化与cut返回的因素的整数向量去一个更直接的解决方案。

data.frame(a, b, e=findInterval(a, c(-Inf, 15, 20, 25, 30))) 
+0

非常不错的'cut'用例。比我的回答好很多。 – sgibb 2012-08-14 11:12:27

+0

谢谢!有趣的是你经常遇到更好的方式来做简单的事情。如果我们还有更好的东西,我不会感到惊讶。 – Backlin 2012-08-14 11:15:26

+1

对不起。刚发布了相同的答案!另一个选择:'test $ e = cut(test $ a,breaks = c(0,15,20,25,30),labels = c(1,2,3,4))' – A5C1D2H2I1M1N2O1R2T1 2012-08-14 11:17:57

1

你不需要循环。 你几乎所有你需要:

test[test$a > 15 & test$a < 20, "e"] <- 2 
3

我会用cut()此:

test$e = cut(test$a, 
      breaks = c(0, 15, 20, 25, 30), 
      labels = c(1, 2, 3, 4)) 

如果你想“概括”切 - 换句话说,你不知道到底有多少套5(水平)您需要 - 你可以使用c()seq()采取两步走的方法:

test$e = cut(test$a, 
      breaks = c(0, seq(from = 15, to = max(test$a)+5, by = 5))) 
levels(test$e) = 1:length(levels(test$e)) 

由于Backlin打我的cut()解决方案,这里的另一种选择(我不喜欢在这个的情况下,但我只是为了演示R中提供的许多选项发布)。

使用来自car包的recode()

require(car)  
test$e = recode(test$a, "0:15 = 1; 15:20 = 2; 20:25 = 3; 25:30 = 4")