【问题标题】:Ifelse generating numeric values in rIfelse 在 r 中生成数值
【发布时间】:2018-01-19 16:58:34
【问题描述】:

我知道有人问过类似的问题,但我找不到我正在寻找的答案。我正在尝试在数据框中的两列中匹配一些字符:

 num   orig   new   match
 1      p      p      T
 2      t      g      F
 3      p      b      F
 4      d      d      T
 5      g      g      T

我想创建一个名为“final”的新列,如果“match”为真,我想将值从 orig 复制到其中。如果“匹配”为假,我想将“新”中的值复制到其中。应该很容易!

我使用代码:

 data <- data %>% mutate(final = ifelse(match == T, orig, new))

当我运行它时,'final' 列中的所有内容都会变成数字。

我也尝试过 if_else,它会生成消息“In [&lt;-.factor(*tmp*, i, value = c(13L, 13L, 2L, 13L, 13L, 4L, : invalid factor level, NA generated"并将我的大部分 FALSE 值转换为 NA。

【问题讨论】:

  • 如果您尝试ifelse(match, as.character(origin), as.character(new)) 会怎样?似乎是factorlevels 写入final
  • 行得通!谢谢!
  • 完美。我猜你不希望它们成为因素,因为你没有预料到这种行为。在这种情况下,您可能需要检查是否设置了stringsAsFactors = FALSE,例如从 CSV 读取数据时。

标签: r if-statement


【解决方案1】:

您可以将列显式转换为字符。

#install.packages("dplyr")
library(dplyr)
data = read.table(header = T,
text = 'num   orig   new   match
1      p      p      T
2      t      g      F
3      p      b      F
4      d      d      T
5      g      g      T')

data <- 
  data %>% 
  mutate_if(is.factor, as.character) %>%
  mutate(final = as.character(ifelse(match == T, orig, new)))

str(data)
#'data.frame':  5 obs. of  5 variables:
#$ num  : int  1 2 3 4 5
#$ orig : chr  "p" "t" "p" "d" ...
#$ new  : chr  "p" "g" "b" "d" ...
#$ match: logi  TRUE FALSE FALSE TRUE TRUE
#$ final: chr  "p" "g" "b" "d" ...

【讨论】:

  • 请注意,您的结果是引用的数字,其中 OP 可能希望 "p", "g", "d".... 而是将输入转换为字符:ifelse(match == T, as.character(orig), as.character(new)),正如 Tino 在 cmets 中建议的那样。
  • 很公平 - 我做了一个快速编辑以将因子更改为字符
  • @Gregor - 你是绝对正确的 - 这是漫长的一天
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多