R中使用apply、data.table时数值自动转字符类型问题咨询
问题原因解答
1 apply函数返回字符类型的原因
apply函数接收数据框作为输入时,会先将整个数据框强制转换为同类型矩阵,而你构造的dat数据框中第一列a是字符型,矩阵只能存储单一类型的数据,因此所有元素都会被向上转型为字符类型。哪怕原始数据中b、c列是数值型,在apply的匿名函数中取出的x["b"]、x["c"]也都是字符值,自然无法直接执行算术运算,必须先显式调用as.numeric做类型转换才能正常计算。
2 data.table返回字符类型的原因
该问题并非data.table本身的逻辑问题,和你操作的前置状态有关:
你在将dat转为data.table之前,已经通过dat$bb <- apply(dat, 1,function(x) x["b"])给dat新增了一个字符类型的bb列。而data.table的:=是原地修改运算符,会保留列原有的数据类型,因此你后续用:=给bb列赋值数值结果时,计算结果会被强制转换为和原列一致的字符类型。
如果提前删除原有字符型bb列,或者赋值到新的列名,就能得到正确的数值类型结果,验证代码如下:
dt <- data.table(dat[, !names(dat) %in% "bb"]) # 移除原有的字符型bb列 dt[, bb := mean(b-c), by=a] typeof(dt$bb) # 输出为 double
dplyr的summarise/mutate逻辑是直接创建新列或覆盖原列的类型,因此不会触发强制类型转换,自然返回数值型结果。
内容的提问来源于stack exchange,提问作者gaut
相关产品推荐
相关产品推荐

