重构data.frame列值

时间:2012-08-14 11:02:15

标签: r dataframe

对不起家伙,如果这是一个菜鸟问题。 我需要有关如何循环我的数据帧的帮助。这是一个示例数据。

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

我需要使用以下“a”栏

值的标准来操纵列“e”

表示

的所有值

“a”&lt; = 15,“e”= 1,

“a”&gt; 15&amp; &LT; 20,“e”= 2

“a”&gt; 20&amp; &LT; 25,“e”= 3

“a”&gt; 25&amp; &LT; 30,“e”= 4等等,看起来像这样

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

我的实际数据帧长度超过100k。如果你能把我排除在外,那就太好了。

3 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:3)

我会使用cut()

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

如果你想“概括”切割 - 换句话说,你不知道你需要做多少套5(级别) - 你可以采用两步法{{ 1}}和c()

seq()

由于Backlin打败了我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)) 解决方案,这是另一个选项(我不喜欢这个的情况,但我发布的只是为了演示R中可用的许多选项)

使用cut()包中的recode()

car

答案 2 :(得分:1)

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

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