首页 > 解决方案 > 在 r 中具有 NA 值的数据帧列表上计算 Z 分数

问题描述

我有一个包含 NA 值的数据框列表。我正在尝试向每个列表添加一个新列,该列表从现有列之一滚动计算 zscore。

说我的清单是:

df1<- data.frame(a= c(1, 2, NA, NA, 10, NA, 5, NA), b= c(4, NA, 4, NA, NA, 5, 7, NA))
df2<- data.frame(a= c(1, 2, NA, NA, 10, NA, 5, NA), b= c(4, NA, 4, NA, NA, 5, 7, NA))
mylist<- list(df1, df2)

我运行它的代码是

for (j in 1:length(mylist)){
  for(i in 1:length(mylist[[j]]))
  mylist[[j]]$z_score[i]<- scale(mylist[[j]]$b[1:i])
}

然而,这会产生 NA 结果。关于我可能做错的任何想法?

标签: rdataframe

解决方案


这是你想要的?

mylist.z <- lapply(mylist, scale)
n <- length(mylist)
for(i in seq(n)) {colnames(mylist.z[[i]]) <- c("az", "bz")}
mylist.2 <- lapply(seq(n), function(i) cbind(mylist[[i]], mylist.z[[i]]))
mylist.2
# [[1]]
#    a  b         az         bz
# 1  1  4 -0.8660254 -0.7071068
# 2  2 NA -0.6185896         NA
# 3 NA  4         NA -0.7071068
# 4 NA NA         NA         NA
# 5 10 NA  1.3608971         NA
# 6 NA  5         NA  0.0000000
# 7  5  7  0.1237179  1.4142136
# 8 NA NA         NA         NA
# 
# [[2]]
#    a  b         az         bz
# 1  1  4 -0.8660254 -0.7071068
# 2  2 NA -0.6185896         NA
# 3 NA  4         NA -0.7071068
# 4 NA NA         NA         NA
# 5 10 NA  1.3608971         NA
# 6 NA  5         NA  0.0000000
# 7  5  7  0.1237179  1.4142136
# 8 NA NA         NA         NA

推荐阅读