当行元素是字符时,列上的条件ifelse

时间:2016-01-14 22:24:44

标签: r

我有一个看起来像这样的数据

  Name Status
1    A      A
2    B      C
3    C      B

我希望结果数据为

> final
  Name Status
1    A      Y
2    B      N
3    C      N

即。其中name = Status然后状态为Y else N

我试过的代码就是这个。但是我收到了这个错误

> data$Status <- ifelse(data$Status == data$Name, "Y","N")
Error in Ops.factor(data$Status, data$Name) : 
  level sets of factors are different

2 个答案:

答案 0 :(得分:1)

我想你的名字和状态都是唯一的因子水平(即名称中的A,B和C与状态中的A,B和D)

要扩展@Conta,如果这些因素可以包含代码

levels(Name)   <- unique(c(levels(Name), levels(Status)))
levels(Status) <- unique(c(levels(Status), levels(Name)))

例如:

> Name   <- factor(c("A","B","C"))
> Status <- factor(c("A","C","D"))
> mydata <- data.frame(Name,Status)
> mydata$Status <- ifelse(mydata$Status == mydata$Name, "Y","N")
    Error in Ops.factor(mydata$Status, mydata$Name) : 
    level sets of factors are different
> 
> levels(Name)   <- unique(c(levels(Name),levels(Status)))
> levels(Status) <- unique(c(levels(Status),levels(Name)))
> 
> Status
[1] A C D
Levels: A C D B
> Name
[1] A B C
Levels: A B C D
> 
> mydata <- data.frame(Name,Status)
> mydata$Status <- ifelse(mydata$Status == mydata$Name, "Y","N")

> mydata
  Name Status
1    A      Y
2    B      N
3    C      N

答案 1 :(得分:1)

进入数据帧的字符值会自动转换为因子(除非stringsAsFactors设置为FALSE)。此代码应该已成功使用双因素数据帧:

final <- cbind( orig[, "Name", drop=FALSE],   # prevents loss of dataframe structure
           Status=ifelse( as.character(orig$Name) == as.character(orig$Status), "Y", "N")
             )

在confusedPerpetually的例子中轻轻测试:

> final
  Name Status
1    A      Y
2    B      N
3    C      N

我认为修改levels属性特别危险,除非它是作为factor调用的参数完成的。使用levels<-是一种快速解决难以恢复的重大错误的方法。我说的是痛苦的经历。