对不起家伙,如果这是一个菜鸟问题。 我需要有关如何循环我的数据帧的帮助。这是一个示例数据。
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。如果你能把我排除在外,那就太好了。
答案 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