Hãy nói rằng tôi có một khung dữ liệu như thế này:yếu tố Nhóm/thu âm trong data.frame cùng
df <- data.frame(a=letters[1:26],1:26)
Và tôi muốn "tái" yếu tố a, b, và c như "a".
Tôi làm như thế nào?
Hãy nói rằng tôi có một khung dữ liệu như thế này:yếu tố Nhóm/thu âm trong data.frame cùng
df <- data.frame(a=letters[1:26],1:26)
Và tôi muốn "tái" yếu tố a, b, và c như "a".
Tôi làm như thế nào?
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ó e
và w
Tôi để nó cho bạn thử kết quả.
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 a
và e
vào mức độ sử dụng Z
recode()
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
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"
Đ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 –
@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? –
"Ít hơn $ 50.000", "$ 50,000- $ 99,999", "$ 100,000- $ 249,999", "$ 250,000- $ 500,000" –
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))
Đâ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ó phải yếu tố đặt hàng để có thể sử dụng được không? –
@ 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. –
Tôi muốn nói đúng thứ tự, không được đặt hàng. Bạn đúng. –