编辑提出更好的问题:
libary("ggplot2)
data("diamonds")
diamonds_small <- diamonds[1:5000, ]
cutnewfunc <- function(x){
ifelse(x == c("Ideal", "Premium", "Very Good", "Good", "Fair"), c("Above Average", "Above Average", "Very Good", "Below Average", "Below Average"), "Default")
}
cutvect = as.vector(diamonds_small$cut)
newdiamonds = cutnewfunc(cutvect)
newdiamonds
结果:
[1]“高于平均水平”“高于平均水平”“默认”“默认”“默认”“默认”“默认”
[8]“非常好”“默认”“默认”“默认”“默认”“默认”“默认”
[15]“默认”“默认”“默认”“默认”“低于平均”“默认”“默认”
正如您所看到的,有很多“默认”值,这些值不应该发生,因为调用cutvect会导致:
[1] "Ideal" "Premium" "Good" "Premium" "Good" "Very Good" "Very Good" "Very Good" "Fair"
[10]“非常好”“好”“理想”“高级”“理想”“高级”“高级”“理想”“好”
[19]“好”“很好”“很好”“很好”“很好”“很好”“很好”“很好”“高级”
我如何比较每个值,而不是“默认”?
谢谢!
我需要比较数据框内的字符串值,相应地生成结果,然后将其添加到数据框中的新列。
我想我需要:1。使用参数字符串的列并形成一个向量, 2.比较字符串并与结果形成一个新的向量, 3.将结果向量作为新列添加到原始数据框中。
比较字符串位对我不起作用。
问题是我需要使用'ifelse'函数,但比较字符串结果'仅适用于逻辑或数值'错误。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:0)
你的问题在这里:
x == c("Ideal", "Premium", "Very Good", "Good", "Fair")
==
不像你想象的那样工作......我们可以尝试一些简单的案例来看看它的作用:
> x = "Premium"
> x == c("Ideal", "Premium", "Very Good", "Good", "Fair")
[1] FALSE TRUE FALSE FALSE FALSE
> x = c("Premium", "Fair")
> x == c("Ideal", "Premium", "Very Good", "Good", "Fair")
[1] FALSE FALSE FALSE FALSE FALSE
Warning message:
In x == c("Ideal", "Premium", "Very Good", "Good", "Fair") :
longer object length is not a multiple of shorter object length
## Notice this result is ALL FALSE!
> x = rep("Premium", 10)
> x == c("Ideal", "Premium", "Very Good", "Good", "Fair")
[1] FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
当我们执行x == y
时,如果x
和y
长度相同,则比较将成对:x的第一个元素与第一个元素相比y,x的第二个与y的第二个相比,等等。如果x
或y
中的一个比另一个长,则较短的一个将重复,直到长度相等,但是比较总是成对。
在这里结合因子水平的更好方法的完整答案如下:
Cleaning up factor levels (collapsing multiple levels/labels)。最好的方法是不使用ifelse
。但是如果你必须使用ifelse
,那就这样做:
cutnewfunc <- function(x){
ifelse(x %in% c("Ideal", "Premium"), "Above Average",
ifelse(x %in% c("Very Good"), "Very Good"), "Default"))
}
我没有完全写出来,因为它听起来像是家庭作业。我会让你填补其余部分。