2016-01-17 50 views
0

我試圖根據同一數據框的另一列「solve_status」列將值分配給Dataframe的新列。所有$ resolved_status都是帶有3個標籤的因子 - 'ABC,XYZ,MNP'。我不得不基於條件指定爲0或1,如果(ABC),然後1否則爲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 

我不知道在哪裏我得到錯誤的。有人可以糾正嗎?

+0

也許'?ifelse'? – Jaap

+0

請分享一個可重現的例子,顯示你有什麼和你需要什麼。 –

+0

有關如何給出[可重現的示例]的一些信息(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

回答

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") 

應該工作。

+0

@Jaap非常感謝。它有幫助。我太過於複雜了。 – maggs

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")) 

,並要替換 「ABC」, 「一個」 和所有其他爲 「d」

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

輸出爲factor與水平自動更改爲'a','d'。