簡體   English   中英

使用基於另一列的分組值創建列

[英]Create column with grouped values based on another column

我確定以前曾經問過,但我不知道要搜索什么,所以我提前道歉。

假設我有以下數據框:

grades <- data.frame(a = 1:40, b = sample(45:100, 40))

使用deplyr,我想創建一個新變量,根據以下標准指示學生收到的成績:90-100 =優秀,80-90 =非常好等。

我以為我可以使用以下內容來獲取mutate()內嵌套ifelse()的結果:

grades %>%
mutate(ifelse(b >= 90, "excellent"), 
       ifelse(b >= 80 & b < 90, "very_good"),
       ifelse(b >= 70 & b < 80, "fair"),
       ifelse(b >= 60 & b < 70, "poor", "fail"))

這不起作用,因為我收到錯誤消息“參數no缺失,沒有默認值”)。 我認為“不”將是最后的“失敗”,但顯然我的語法錯了。

如果我先單獨過濾原始數據,然后調用ifelse,我可以得到這個,如下所示:

a <- grades %>%
     filter( b >= 90) %>%
     mutate(final = ifelse(b >= 90, "excellent"))

和rbind a,b,c等等。顯然,這不是我想要的方式,但我想理解ifelse()的語法。 我猜測后者是有效的,因為沒有任何值不符合標准,但是當有多個ifelse時,我仍然無法弄清楚如何讓它工作。

使用級別和標簽定義向量,然后在b列上使用cut

levels <- c(-Inf, 60, 70, 80, 90, Inf)
labels <- c("Fail", "Poor", "fair", "very good", "excellent")
grades %>% mutate(x = cut(b, levels, labels = labels))
    a   b         x
1   1  66      Poor
2   2  78      fair
3   3  97 excellent
4   4  46      Fail
5   5  89 very good
6   6  57      Fail
7   7  80      fair
8   8  98 excellent
9   9 100 excellent
10 10  93 excellent
11 11  59      Fail
12 12  51      Fail
13 13  69      Poor
14 14  75      fair
15 15  72      fair
16 16  48      Fail
17 17  74      fair
18 18  54      Fail
19 19  62      Poor
20 20  64      Poor
21 21  88 very good
22 22  70      Poor
23 23  85 very good
24 24  58      Fail
25 25  95 excellent
26 26  56      Fail
27 27  65      Poor
28 28  68      Poor
29 29  91 excellent
30 30  76      fair
31 31  82 very good
32 32  55      Fail
33 33  96 excellent
34 34  83 very good
35 35  61      Poor
36 36  60      Fail
37 37  77      fair
38 38  47      Fail
39 39  73      fair
40 40  71      fair

或者使用data.table:

library(data.table)
setDT(grades)[, x := cut(b, levels, labels)]

或者只是在基地R:

grades$x <- cut(grades$b, levels, labels)

注意

在仔細研究了你的初始方法之后,我注意到你需要在cut調用中包含right = FALSE ,因為例如,90分應該是“優秀”,而不僅僅是“非常好”。 因此,它用於定義間隔應該關閉的位置(左側或右側),默認值位於右側,這與OP的初始方法略有不同。 所以在dplyr中,它將是:

grades %>% mutate(x = cut(b, levels, labels, right = FALSE))

因此在其他選擇中。

所有的ifelse需要在彼此之內。 嘗試這個:

mutate(ifelse(b >= 90, "excellent", 
       ifelse(b >= 80 & b < 90, "very_good",
       ifelse(b >= 70 & b < 80, "fair",
       ifelse(b >= 60 & b < 70, "poor", "fail")))))
grades$c = grades$b # creating a new column 
#and filling in the grades
grades$c[grades$c >= 90] = "exellent"
grades$c[grades$c <= 90 &  grades$c >= 80] = "very good"
grades$c[grades$c <= 80 &  grades$c >= 70] = "fair"
grades$c[grades$c <= 70 &  grades$c >= 60] = "poor"
grades$c[grades$c <= 60] = "fail"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM