我在基于某些条件将字符变量转换为数字变量时遇到了R data.table的问题:
library(data.table)
DT1 <- data.table(a = "A", b = "B")
DT2 <- data.table(a = "A", b = "B")
DT1[a == "A", b := ifelse(b == "B", 1, 0)] #option 1: incorrect behavior
DT2[, b := ifelse(b == "B", 1, 0)] #option 2: correct behavior
Run Code Online (Sandbox Code Playgroud)
预期正确的输出:
a b
1: A (character) 1 (numeric)
Run Code Online (Sandbox Code Playgroud)
但是,使用选项1,我得到以下输出(带有警告):
a b
1: A (character) 1 (character)
Run Code Online (Sandbox Code Playgroud)
警告信息:
在
[.data.table(DT1,a ==“ A”,:=(b,ifelse(b ==“ B”,1,0)))中:将双RHS强制转换为字符以匹配目标列的类型(第2列名为“ b”)。如果目标列的类型字符正确,则为避免效率强迫,最好将RHS创建为类型字符,以提高效率。为了实现这一点,请考虑R的类型后缀:typeof(0L)vs typeof(0),以及typeof(NA)vs typeof(NA_integer_)vs typeof(NA_real_)。您可以使用as.character()来包装RHS以避免出现此警告,但仍会强制执行。如果目标列的类型不正确,则最好重新访问DT的创建位置,然后在其中修复该列的类型。例如,通过在fread()中使用colClasses =。否则,您现在可以通过在其顶部插入一个新列(所需类型)来更改列类型;例如DT [,
b:= …
作为dplyr及其整洁的数据概念的忠实拥护者,我想在数据帧中存在某个特定变量时对其进行突变。这是个主意:
# Load libraries
library(dplyr)
# Create data frames
df1 <- data.frame(year = 2000:2010, foo = 0:10)
df2 <- data.frame(year = 2000:2010)
# Create function
cnd_mtt <- function(df){
df %>%
mutate_if(colname == "foo", as.factor) # <---- this is the tricky part
}
Run Code Online (Sandbox Code Playgroud)
预期的结果:该函数应同时适用于数据帧和无错误
有想法吗?