我正在尝试使用
dplyr::mutate
获取一个字符变量并从中创建一个数字变量。我使用的方法给我一个错误,我不确定为什么。
示例:具有两个字符变量的数据框。一个总是有可以转换为整数的字符串,有时有一个字母“E”。我想将两列都转换为数字,用零替换字母“E”。
df <- data.frame(
always_numstring=c("4", "1", "3"),
usually_numstring=c("4", "1", "E"))
以下行按预期工作:
df %>% mutate(x=ifelse(always_numstring=="E", 0, as.numeric(always_numstring)))
always_numstring usually_numstring x
1 4 4 4
2 1 1 1
3 3 E 3
下面一行没有:
df %>% mutate(x=ifelse(usually_numstring=="E", 0, as.numeric(usually_numstring)))
Error in base::nchar(wide_chars$test, type = "width") :
promise already under evaluation: recursive default argument reference or earlier problems?
我什至没想到它会尝试将“E”转换为数字。更重要的是,我不明白为什么这是致命的,而
as.numeric("E")
通常不是。
这是一个非 dplyr 版本,它发出警告但随后按预期工作:
df$x <- ifelse(df$usually_numstring=="E", 0, as.numeric(df$usually_numstring))
Warning message:
In ifelse(df$usually_numstring == "E", 0, as.numeric(df$usually_numstring)) :
NAs introduced by coercion
df
always_numstring usually_numstring x
1 4 4 4
2 1 1 1
3 3 E 0
问题:
奖金问题:
当它试图将“E”转换为数字时,它显然快要死了。为什么那是致命的?
为什么这个特定的错误消息?
你能指出为什么 ifelse() 正在评估
yes
和 no
表达式的解释吗?我的默认设置是期望它在这里表现得像if()
。