2012-10-15 62 views
5

Tôi có một chuyển đổi cột khung dữ liệu đơn giản có thể được thực hiện bằng cách sử dụng một vòng lặp if/else, nhưng tôi đã tự hỏi nếu có một cách tốt hơn để làm điều này.Làm cách nào để thay đổi giá trị cột trong một khung dữ liệu?

Khung dữ liệu ban đầu là,

df <-data.frame(cbind(x=rep(10:15,3), y=0:8)) 
df 
    x y 
1 10 0 
2 11 1 
3 12 2 
4 13 3 
5 14 4 
6 15 5 
7 10 6 
8 11 7 
9 12 8 
10 13 0 
11 14 1 
12 15 2 
13 10 3 
14 11 4 
15 12 5 
16 13 6 
17 14 7 
18 15 8 

những gì tôi cần làm là thay thế các giá trị trong cột 'y' như vậy mà

'0' gets replaced with '2', 
'1' gets replaced with '2.2', 
'2' gets replaced with '2.4', 
... 
... 
'6' gets replaced with '3.2' 
'7' gets replaced with '3.3' 
'8' gets replaced with '10' 

để tôi kết thúc với một cái gì đó như thế nào,

> df 
    x y 
1 10 2.0 
2 11 2.2 
3 12 2.4 
4 13 2.6 
5 14 2.8 
6 15 3.0 
7 10 3.2 
8 11 3.3 
9 12 10.0 
10 13 2.0 
11 14 2.2 
12 15 2.4 
13 10 2.6 
14 11 2.8 
15 12 3.0 
16 13 3.2 
17 14 3.3 
18 15 10.0 

Tôi đã tìm kiếm và tìm thấy một số đề xuất nhưng không thể khiến chúng hoạt động. Một trong những lần thử là một cái gì đó như thế,

> levels(factor(df$y)) <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 

Error in levels(factor(df$y)) <- c(2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.3, : 
    could not find function "factor<-" 

Nhưng tôi nhận được thông báo lỗi được hiển thị ở trên.

Có ai có thể giúp tôi với điều này không?

+0

Xin lỗi Ben, sai lầm của tôi. Tôi vừa chỉnh sửa bài đăng gốc của mình bằng bản chỉnh sửa. –

Trả lời

5

Sử dụng thực tế là y+1 là một chỉ số cho việc thay thế

cái gì đó như

replacement <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df <- within(df, z <- replacement[y+1]) 

Hoặc, sử dụng data.table cho hiệu quả bộ nhớ đường và bộ nhớ

library(data.table) 
DT <- as.data.table(df) 

DT[, z := replacement[y+1]] 
+0

Cảm ơn bạn mnel, đề xuất của bạn bằng cách sử dụng bên trong làm việc hoàn hảo! –

3

Làm thế nào về:

mylevels <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10) 
df$z <- as.numeric(as.character(factor(df$y,labels=mylevels))) 

này cũng phù hợp với kết quả mong muốn của bạn:

transform(df,z=ifelse(y==7,3.3,ifelse(y==8,10,2+y/5))) 
+0

Cảm ơn bạn Ben. Đề xuất của bạn hoạt động giống như đề xuất của mnel. –

Các vấn đề liên quan