[英]How to do conditional computation of rowMeans in R?
我想計算跨越幾個變量rowMeans,但目前的數據只有在至少有80%是。 在第一個示例中,均值應該僅針對第一行進行計算。 在第二個中,不應計算任何均值。 我如何做到這一點?
x <- c(1, 2)
y <- c(1, 2)
z <- c(1, NA)
z1 <- c(1, NA)
z2 <- c(1, NA)
df <- data.frame(x, y, z, z1, z2)
df$means <- rowMeans(df)
df
x y z z1 z2 means
1 1 1 1 1 1 1
2 2 2 NA NA NA NA
x <- c(1, 2)
y <- c(1, 2)
z <- c(1, 2)
z1 <- c(1, 2)
z2 <- c(1, NA)
df <- data.frame(x, y, z, z1, z2)
df$means <- rowMeans(df)
df
x y z z1 z2 means
1 1 1 1 1 1 1
2 2 2 2 2 NA 2
也許像這樣?
transform(df, means = apply(df, 1, function(x)
ifelse(sum(is.na(x)) / length(x) < 0.2, mean(x, na.rm = T), NA)))
# x y z z1 z2 means
#1 1 1 1 1 1 1
#2 2 2 NA NA NA NA
說明:我們計算每行NA
的分數,並且僅當分數<0.2(即該行包含至少80%的非NA
值)時才返回行均值。
另一種完全矢量化的方法,我們首先計算所有行的均值。
df1$means <- rowMeans(df1, na.rm = TRUE)
現在,我們通過替換那些價值NA
那里有不到80%的非NA
每行秒。
old_cols <- setdiff(names(df1), "means")
NA_rows <- 1 - rowMeans(is.na(df1[, old_cols])) < 0.8
df1[NA_rows, "means"] <- NA
df1
# x y z z1 z2 means
#1 1 1 1 1 1 1
#2 2 2 NA NA NA NA
數據
df1 <- structure(list(x = c(1, 2), y = c(1, 2), z = c(1, NA), z1 = c(1,
NA), z2 = c(1, NA)), .Names = c("x", "y", "z", "z1", "z2"), row.names = c(NA,
-2L), class = "data.frame")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.