只将一些因素转换为不同的因素

时间:2015-08-07 18:35:46

标签: r conditional categorical-data recode

我正在尝试构建一个与两个因子水平完全不同的其他因子列相关的因子列。这是示例数据。

set.seed(1234)
a<-sample(LETTERS[1:10],50,replace=TRUE)
b<-sample(letters[11:20],50,replace=TRUE)
df<-data.frame(a,b)
df$a<-as.factor(df$a)
df$b<-as.factor(df$b)

我想要制作的规则会创建一个新列c,它基于列a的值来确定因子级别值。 如果列a中的任何行=“F”,则列c中的该行将等于列b的条目。我正在尝试的代码:

dfn<-dim(df)[1]
for (i in 1:dfn){
df$c[i]<-ifelse(df$a[i]=="F",df$b[i],df$a[i])
}
df

仅吐出列b的因子级别的编号索引,而不是实际的条目。我做错了什么?

3 个答案:

答案 0 :(得分:2)

我认为你需要对字符值进行一些处理。这似乎是这样做的。

w <- df$a == "F"    
df$c <- factor(replace(as.character(df$a), w, as.character(df$b)[w]))

以下是新专栏的快速浏览

factor(replace(as.character(df$a), w, as.character(df$b)[w]))
#  [1] B G G G I G A C G s G k C J C I C C B C D D B A C I n J I A
# [31] E C D p B H C C J I l G D G D p G E C H
# Levels: A B C D E G H I J k l n p s

答案 1 :(得分:2)

正如我之前的评论,dplyr的解决方案:

df %>% mutate(c = ifelse(a == "F", as.character(b), as.character(a)))

答案 2 :(得分:1)

如果你打算做任何涉及列作为因素的组合的事情,例如,比较,你应该重构到同一组级别。

ls -l

通过采取这种预防措施,你可以明智地做到

u<-union(levels(df$a),levels(df$b))
df$a<-factor(df$a,u)
df$b<-factor(df$b,u)
df$c<-df$a
ind<-df$a=="F" 
df$c[ind]<-df$b[ind]

否则第一行将失败。