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
相关产品推荐
相关产品推荐

