我有一个看起来像这样的数据
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
答案 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<-
是一种快速解决难以恢复的重大错误的方法。我说的是痛苦的经历。