R:使用多个条件重新编码变量的单个因子

时间:2016-10-04 16:12:28

标签: r if-statement conditional

我有一个4级的因子变量:

set.seed(1)
d <- sample(1:4,20,replace=TRUE)
df <- factor(d,labels=c("A","B","C","D"))

我想分发&#34; C&#34;在&#34; B&#34;之间和&#34; D&#34;条件是另一个变量的值:

df <- as.data.frame(df)
names(df)[names(df)=="df"] <- "var1"
df$var2 <- rnorm(20,5,2)

我以为我可以分组&#34; C&#34;而ifelse根据某些标准进行重新编码;说

df$var1[df$var1=="C"] <- ifelse(df$var1=="C" & df$var2 < 4, "B", "D")

但是R并不喜欢它(可能是有充分理由的)并且将所有C分配给&#34; D&#34;。我怀疑第二个条件不按预期工作。即使有效,也可能有更有效的解决方案。想法?

2 个答案:

答案 0 :(得分:4)

我想,你需要

df$var1[df$var1 == "C"] <- ifelse(df[df$var1 == "C", "var2"] < 4, "B", "D")

这仍然会保持级别C

df$var1
#[1] B B B D A D D D D A A A D B D B D D B D
#Levels: A B C D

您可以使用droplevels

删除未使用的级别
df$var1 <- droplevels(df$var1)

df$var1
#[1] B B B D A D D D D A A A D B D B D D B D
#Levels: A B D

或者只是再次申请factor

df$var1 <- factor(df$var1)

答案 1 :(得分:2)

这个怎么样?

sub.df <- df[df$var1=="C",] # subset you are concerned
sub.df$var1 <- ifelse(sub.df$var2 < 4, "B", "D") # modify
df[df$var1=="C",] <- sub.df # update the subset