R在比较其中的字符串值后向数据框添加列

时间:2018-01-11 14:16:38

标签: r string

编辑提出更好的问题:

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'函数,但比较字符串结果'仅适用于逻辑或数值'错误。

有人可以帮忙吗?

谢谢!

1 个答案:

答案 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时,如果xy长度相同,则比较将成对:x的第一个元素与第一个元素相比y,x的第二个与y的第二个相比,等等。如果xy中的一个比另一个长,则较短的一个将重复,直到长度相等,但是比较总是成对

在这里结合因子水平的更好方法的完整答案如下:  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"))
}

我没有完全写出来,因为它听起来像是家庭作业。我会让你填补其余部分。