仅将某些因素转换为不同的因素
convert only some factors into a different factor
我正在尝试构建一个因子列,该列与另外两个具有完全不同因子水平的因子列相关。这是示例数据。
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 列的因子水平的编号索引,而不是实际条目。我做错了什么?
我认为您需要对字符值进行一些修改。这个好像可以。
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
正如我之前的评论,dplyr
的解决方案:
df %>% mutate(c = ifelse(a == "F", as.character(b), as.character(a)))
如果您打算做任何涉及列组合的事情作为因素,例如,比较,您应该重构到同一组级别。
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]
通过采取这种预防措施,您可以明智地做到
> sum(df$c==df$b)
[1] 6
> sum(df$a=="F")
[1] 6
否则第一行会失败
我正在尝试构建一个因子列,该列与另外两个具有完全不同因子水平的因子列相关。这是示例数据。
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 列的因子水平的编号索引,而不是实际条目。我做错了什么?
我认为您需要对字符值进行一些修改。这个好像可以。
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
正如我之前的评论,dplyr
的解决方案:
df %>% mutate(c = ifelse(a == "F", as.character(b), as.character(a)))
如果您打算做任何涉及列组合的事情作为因素,例如,比较,您应该重构到同一组级别。
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]
通过采取这种预防措施,您可以明智地做到
> sum(df$c==df$b)
[1] 6
> sum(df$a=="F")
[1] 6
否则第一行会失败