2012-08-14 40 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")