我有一个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;。我怀疑第二个条件不按预期工作。即使有效,也可能有更有效的解决方案。想法?
答案 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