![](/img/trans.png)
[英]How to create a new column in a dataframe based on grouped permutations of another column
[英]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.