2010-10-06 33 views

Trả lời

13

Có ai cố gắng sử dụng phương pháp đơn giản này? Nó đòi hỏi không có gói đặc biệt, chỉ là một sự hiểu biết về cách R xử lý các yếu tố.

Giả sử bạn muốn đổi tên các cấp trong một yếu tố, có được chỉ số của họ

data <- data.frame(a=letters[1:26],1:26) 
lalpha <- levels(data$a) 

Trong ví dụ này chúng ta tưởng tượng chúng tôi muốn biết chỉ số cho mức 'e' và 'w'

lalpha <- levels(data$a) 
ind <- c(which(lalpha == 'e'), which(lalpha == 'w')) 

Bây giờ chúng ta có thể sử dụng chỉ số này để thay thế các cấp độ của yếu tố 'a'

levels(data$a)[ind] <- 'X' 

Nếu bây giờ bạn nhìn vào d yếu tố ataframe a sẽ có X khi có ew

Tôi để nó cho bạn thử kết quả.

14

Một lựa chọn là recode() chức năng trong gói car:

require(car) 
df <- data.frame(a=letters[1:26],1:26) 
df2 <- within(df, a <- recode(a, 'c("a","b","c")="a"')) 
> head(df2) 
    a X1.26 
1 a  1 
2 a  2 
3 a  3 
4 d  4 
5 e  5 
6 f  6 

Ví dụ nơi a là không đơn giản như vậy và chúng tôi recode nhiều cấp độ thành một.

set.seed(123) 
df3 <- data.frame(a = sample(letters[1:5], 100, replace = TRUE), 
        b = 1:100) 
with(df3, head(a)) 
with(df3, table(a)) 

những dòng cuối cùng đưa ra:

> with(df3, head(a)) 
[1] b d c e e a 
Levels: a b c d e 
> with(df3, table(a)) 
a 
a b c d e 
19 20 21 22 18 

Bây giờ cho phép kết hợp mức ae vào mức độ sử dụng Zrecode()

df4 <- within(df3, a <- recode(a, 'c("a","e")="Z"')) 
with(df4, head(a)) 
with(df4, table(a)) 

mang đến cho:

> with(df4, head(a)) 
[1] b d c Z Z Z 
Levels: b c d Z 
> with(df4, table(a)) 
a 
b c d Z 
20 21 22 37 

Việc làm này mà không cần đánh vần ra mức sáp nhập:

## Select the levels you want (here 'a' and 'e') 
lev.want <- with(df3, levels(a)[c(1,5)]) 
## now paste together 
lev.want <- paste(lev.want, collapse = "','") 
## then bolt on the extra bit 
codes <- paste("c('", lev.want, "')='Z'", sep = "") 
## then use within recode() 
df5 <- within(df3, a <- recode(a, codes)) 
with(df5, table(a)) 

nào cho chúng ta giống như df4 trên:

> with(df5, table(a)) 
a 
b c d Z 
20 21 22 37 
+0

Có phải yếu tố đặt hàng để có thể sử dụng được không? –

+0

@ Nhãn hiệu: không, và trong ví dụ trên, nó không được đặt hàng từ quan điểm của 'với (df, is.ordered (a))'. Tôi sẽ thêm một ví dụ khác cho thấy một cái gì đó mà 'a' không đơn giản như bản gốc của bạn. –

+0

Tôi muốn nói đúng thứ tự, không được đặt hàng. Bạn đúng. –

3

Bạn có thể làm một cái gì đó như:

df$a[df$a %in% c("a","b","c")] <- "a" 

CẬP NHẬT: Các yếu tố phức tạp hơn.

Data <- data.frame(a=sample(c("Less than $50,000","$50,000-$99,999", 
    "$100,000-$249,999", "$250,000-$500,000"),20,TRUE),n=1:20) 
rows <- Data$a %in% c("$50,000-$99,999", "$100,000-$249,999") 
Data$a[rows] <- "$250,000-$500,000" 
+0

Điều này làm việc tốt cho ví dụ mà tôi đã cung cấp, nhưng nó phá vỡ ngay khi tôi cố gắng sử dụng các tên yếu tố phức tạp hơn –

+0

@Brandon bạn có thể cung cấp ví dụ về "các tên yếu tố phức tạp hơn" không? –

+0

"Ít hơn $ 50.000", "$ 50,000- $ 99,999", "$ 100,000- $ 249,999", "$ 250,000- $ 500,000" –

2

có hai cách. nếu bạn không muốn bỏ các mức không sử dụng, tức là "b" và "c", giải pháp của Joshua có lẽ là tốt nhất.

nếu bạn muốn thả các cấp không sử dụng, sau đó

df$a<-factor(ifelse(df$a%in%c("a","b","c"),"a",as.character(df$a))) 

hoặc

levels(df$a)<-ifelse(levels(df$a)%in%c("a","b","c"),"a",levels(df$a)) 
0

Đây là một phiên bản đơn giản của câu trả lời lựa chọn:

Tôi đã phát hiện ra rằng cách dễ nhất để đối phó với điều này chỉ đơn giản là ghi đè lên các mức yếu tố bằng cách nhìn vào chúng và sau đó viết những con số xuống để được ghi đè .

df <- data.frame(a=letters[1:26],1:26) 
levels(df) 

> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" 
"p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" 

levels(df$a)[c(1,2)] <- "c" 
summary(df$a) 

> c d e f g h i j k l m n o p q r s t u v w x y z 
    3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
Các vấn đề liên quan