0

对不起,如果这是一个菜鸟问题。我需要有关如何遍历我的数据框的帮助。这是一个示例数据。

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

我需要使用以下“a”列中的值的标准来操作“e”列

对于所有值

"a" <= 15, "e" = 1,

"a" > 15 & < 20, "e" = 2

"a" > 20 & < 25, "e" = 3

"a" > 25 & < 30, "e" = 4 等等看起来像这样

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

我的实际数据框长度超过 100k。如果你能在这里帮我整理一下就好了。

4

3 回答 3

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

更新:

Greg 的评论提供了一个更直接的解决方案,而无需通过从cut.

data.frame(a, b, e=findInterval(a, c(-Inf, 15, 20, 25, 30)))
于 2012-08-14T11:11:24.200 回答
4

我会用cut()这个:

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

如果您想“概括”剪切 - 换句话说,您不确切知道需要制作多少组 5(级别) - 您可以使用c()and采取两步方法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 中可用的许多选项)。

recode()car包装中使用。

require(car)    
test$e = recode(test$a, "0:15 = 1; 15:20 = 2; 20:25 = 3; 25:30 = 4")
于 2012-08-14T11:15:16.053 回答
1

你不需要循环。您几乎拥有所需的一切:

test[test$a > 15 & test$a < 20, "e"] <- 2
于 2012-08-14T11:09:58.653 回答