You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言对指定连续列每行计算偏度返回NaN问题求助

问题分析与解决方案

首先,你遇到的NaN结果主要有两个核心原因,咱们一步步拆解:

1. rowwise环境下的列引用错误

在dplyr的rowwise()上下文里,直接写V1:V1998并没有把当前行的这些列值转换成数值向量——moments::skewness()函数需要接收一个向量作为输入,而你传递的是列的符号引用,它无法正确解析,自然返回NaN。

2. 缺失值或零方差的影响

如果你的行内存在NA值(且没设置na.rm=TRUE),或者某一行的所有数值完全相同(方差为0),skewness()也会返回NaN:

  • 零方差时,偏度计算需要除以标准差的三次方,分母为0会导致结果无意义;
  • 存在NA且未忽略时,函数直接返回NaN。

修正后的代码

用c_across()来正确提取每行的V1:V1998列值为向量,同时加上缺失值处理参数:

library(dplyr)
library(moments)

ND2a <- NoDup2 %>% 
  rowwise() %>% 
  # 用c_across转换为行向量,同时忽略NA值
  mutate(skew2 = skewness(c_across(V1:V1998), na.rm = TRUE)) %>%
  ungroup()  # 用完rowwise后取消分组,避免后续操作效率下降

额外排查步骤

如果还是有NaN,可以进一步排查:

  • 检查数据类型:确保V1:V1998都是数值型列,用str(NoDup2 %>% select(V1:V1998))查看,若为字符型先转换:
    NoDup2 <- NoDup2 %>% mutate(across(V1:V1998, as.numeric))
    
  • 检查零方差行:新增列查看每行的方差,确认是否有全相同值的行:
    ND2a <- NoDup2 %>% 
      rowwise() %>% 
      mutate(
        row_var = var(c_across(V1:V1998), na.rm = TRUE),
        skew2 = ifelse(row_var == 0, NA, skewness(c_across(V1:V1998), na.rm = TRUE))
      ) %>%
      ungroup()
    
    这里把零方差行的偏度设为NA,更符合逻辑。

内容的提问来源于stack exchange,提问作者CodingIsHardMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:26:47