更改列的因子值

时间:2016-01-17 08:17:10

标签: r dataframe

我正在尝试根据同一数据帧的另一列“solve_status”列将值分配给Dataframe的新列。所有$ resolved_status都是一个有3个标签的因子-'ABC,XYZ,MNP'。我必须根据条件分配0或1 if(ABC)然后1 else 0。

我有以下数据

 solved_status
1            ABC
2            XYZ
3            ABC
4            MNP
5            XYZ
6            MNP

我必须将其更改为

   solved_status   cls
1           ABC     1
2           XYZ     0
3           ABC     1
4           MNP     0
5           XYZ     0
6           MNP     0

  pre$cls <- function(x){if(factor(pre$solved_status[x])=="ABC"){ pre$cls[x] = 1} else {pre[x,'cls'] =0}}

发生错误 -

 Error in rep(value, length.out = nrows) : attempt to replicate an object of type 'closure'
然后我用Google搜索并将其更改为 -

> func <- function(x){if(as.character(pre[x,'solved_status'])=="ABC"){ pre[x,'cls'] = 1} else { pre[x,'cls'] =0} }
> pre$cls = lapply(pre$solved_status,func)

再次出错 -

Error in Summary.factor(2L, na.rm = FALSE) : 'max' not meaningful for factors 

我不知道我哪里出错了。有人可以纠正吗?

2 个答案:

答案 0 :(得分:2)

无需编写自定义函数。您可以使用buildin R功能。之一:

all$class <- ifelse(all$solved_status=="ABC", 1, 0)

或:

all$class <- c(0,1)[all$solved_status=="ABC" + 1L]

或:

all$class <- as.integer(all$solved_status=="ABC")

应该有用。

答案 1 :(得分:1)

以下是recode

的另一个选项
library(car)
recode(df1$solved_status, "'ABC'=1;else=0")
#[1] 1 0 1 0 0 0

recode的优势在于它可以用于factorcharacter列并将其更改为任何值。

假设我们有一个factor向量

v1 <- factor(c("ABC", "ACD", "AFD", "ADR", "ABC", "ANC"))

并想要取代&#34; ABC&#34;与&#34; a&#34;以及所有其他人作为&#34; d&#34;

recode(v1, "'ABC'= 'a'; else = 'd'")
#[1] a d d d a d
#Levels: a d

输出为factor,其等级自动更改为&#39; a&#39;&#39; d&#39;。