重构data.frame列值

重构data.frame列值,r,dataframe,R,Dataframe,抱歉,伙计们,如果这是一个noob问题。 我需要关于如何在数据帧上循环的帮助。这是一个示例数据 a <- c(10:29); b <- c(40:59); e <- rep(1,20); test <- data.frame(a,b,e) 我需要使用列a中的值的以下条件来操作列e 对于所有的价值观 a 15&20&25&

抱歉,伙计们,如果这是一个noob问题。 我需要关于如何在数据帧上循环的帮助。这是一个示例数据

a <- c(10:29);
b <- c(40:59);
e <- rep(1,20);
test <- data.frame(a,b,e)
我需要使用列a中的值的以下条件来操作列e

对于所有的价值观

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。如果你能在这里帮我分类就太好了。

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

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

comment提供了一个更直接的解决方案,而无需使用cut返回的因子子集整型向量

我会用cut来做这个:

test$e = cut(test$a, 
             breaks = c(0, 15, 20, 25, 30), 
             labels = c(1, 2, 3, 4))
换言之,如果您想概括切割,您不知道需要制作多少组5个级别,您可以使用c和seq采取两步方法:

既然Backlin在cut解决方案上击败了我,这里有另一个我不喜欢的选项,但我在这里只是为了演示R中的许多可用选项

使用汽车包装上的重新编码


非常好的cut用例。比我的答案好多了。谢谢!有趣的是,你经常会遇到做简单事情的更好方法。如果我们能得到更好的东西,我也不会感到惊讶。对不起。刚刚发布了相同的答案!另一个选项:test$e=cuttest$a,breaks=c0,15,20,25,30,labels=c1,2,3,4在这种情况下,findInterval函数可能比cut简单一些。我认为标题应该反映出这里所做的事情。您正在尝试根据其他列的值添加重新编码的列。抱歉,标题不是最佳标题,您是对的-这是关于根据其他列重新编码列。但不管怎样,你们帮了我的忙:只是想帮助下一个对这个问题感兴趣的人。通过给它一个信息丰富的标题,你的答案更有可能帮助别人。请随意编辑标题以反映您的问题:
data.frame(a, b, e=findInterval(a, c(-Inf, 15, 20, 25, 30)))
test$e = cut(test$a, 
             breaks = c(0, 15, 20, 25, 30), 
             labels = c(1, 2, 3, 4))
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))
require(car)    
test$e = recode(test$a, "0:15 = 1; 15:20 = 2; 20:25 = 3; 25:30 = 4")