使用以下示例数据,我试图基于四个条件变量(“ A”)的值在我的dataframe(df)中创建一个新列“ NOTA_NUM”(值0或1或2或3或4) “”,“ B”,“ C”,“ D”,“ E”)从一个现有列(第1列)开始。
我已经尝试过:
df$NOTA_NUM <- ifelse(rowSums(df[ , "column1"]=="A"), 0,
ifelse(rowSums(df[ , "column1"]=="B"), 1,
ifelse(rowSums(df[ ,"column1"]=="C"), 2,
ifelse(rowSums(df[ , "column1"]=="D",3,4))
但是这并没有达到我想要的方式。
我希望“ NOTA_NUM”看起来像这样:
column1 NOTA_NUM
A 0
C 2
B 1
D 3
E 4
答案 0 :(得分:4)
以下是一些方法。不使用任何软件包。
1)匹配使用末尾注释中可重复显示的DF
将column1
中的每个元素匹配到LETTERS[1:4]
,如果不匹配则使用5。从中减去1。
transform(DF, NOIA_NUM = match(column1, LETTERS[1:4], nomatch = 5) - 1)
给予:
column1 NOIA_NUM
1 A 0
2 C 2
3 B 1
4 D 3
5 E 4
2)开关:另一种可能性是使用switch
:
transform(DF, NOTA_NUM = sapply(column1, switch, A = 0, B = 1, C = 2, D = 3, 4))
3)算术:此算法使用算术表达式,其计算结果为所需值:
transform(DF, NOTA_NUM = (0-4) * (column1 == "A") +
(1-4) * (column1 == "B") +
(2-4) * (column1 == "C") +
(3-4) * (column1 == "D") +
4)
DF <- data.frame(column1 = c("A", "C", "B", "D", "E"), stringsAsFactors = FALSE)
答案 1 :(得分:1)
在以下情况下,我喜欢dplyr::case_when
:
library(dplyr)
df <- data.frame(column1 = c("A", "C", "B", "D", "E")) %>%
mutate(NOTA_NUM = case_when(column1 == "A" ~ 0,
column1 == "B" ~ 1,
column1 == "C" ~ 2,
column1 == "D" ~ 3,
TRUE ~ 4))
答案 2 :(得分:0)
为此,我会避免使用ifelse
。您应该使用一种更高效,更紧凑的方法进行表查找或转换。尝试使用命名向量作为表格,并将输入传递给“ [”函数:
> lookup = c(A=0, C= 2, B = 1, D= 3, E = 4)
> df <- data.frame( cl1 = names(lookup))
> df
cl1
1 A
2 C
3 B
4 D
5 E
> df$NOTA_NUM= lookup[df$cl1]
> df
cl1 NOTA_NUM
1 A 0
2 C 1
3 B 2
4 D 3
5 E 4
如果您需要将它们作为字母,请在查找向量中将它们引号,但要注意,除非明确阻止该默认操作,否则data.frame函数将使它们成为因素。请参阅?data.frame
以正确使用stringsAsFactors
参数
答案 3 :(得分:0)
不确定我建议使用as.numeric(factor(...))
作为一般解决方案,但可以解决您的情况:
library(dplyr)
set.seed(1001) # for reproducible sample
# column1 = factor as stringsAsFactors = TRUE (default)
data.frame(column1 = sample(LETTERS[1:5], 50, replace = TRUE)) %>%
mutate(NOTA_NUM = as.numeric(column1)-1)